2012-02-13 46 views
9

Trong môi trường unix, các hàm chức năng đôi khi được sử dụng để thực hiện coroutines trong C. Tuy nhiên, các hàm này trực tiếp thao tác ngăn xếp và luồng thực thi. Thông thường khi các chức năng cấp thấp này hoàn toàn khác nhau khi chuyển từ C sang C++.Hàm makecontext()/swapcontext() có tương thích với C++

Vì vậy, câu hỏi đặt ra là, nếu có bất kỳ vấn đề nào với việc triển khai coroutines sử dụng makecontext()swapcontext(). Tất nhiên người ta rõ ràng sẽ phải chăm sóc rất tốt, rằng một ngoại lệ không bao giờ có thể thoát khỏi một coroutine như vậy, vì sẽ không có trình xử lý ngoại lệ nào trên stack cho chương trình này và chương trình rất có thể sẽ bị phân đoạn. Nhưng khác hơn là có bất kỳ sự không tương thích giữa cách C + + xử lý mọi thứ trong nội bộ và makecontext()setcontext() sửa đổi đường dẫn thực hiện?

+0

Tôi chưa bao giờ nghe nói về các chức năng này. Bạn có biết rằng [POSIX 2001] (http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html) đã đánh dấu chúng lỗi thời về chủ đề? –

+6

@larsmans: Một điều đáng tiếc. Những thứ dễ dàng với coroutines khó hơn nhiều với các chủ đề. Có, bạn * có thể * mô phỏng coroutines với chủ đề, nhưng chỉ với overhead (đồng bộ hóa!), Và khi chỉ có một luồng đang chạy bất cứ lúc nào với tất cả những người khác bị chặn, nó không thực sự là những gì luồng có nghĩa là cho. – celtschk

Trả lời

6

Tôi đã sử dụng makecontext()/swapcontext() bằng mã C++ trước đây và như bạn nói, điều chính cần xem là ngoại lệ. Ngoài ra tôi không gặp rắc rối gì cả. Mặc dù đã lỗi thời theo tiêu chuẩn, chúng vẫn được hỗ trợ tốt bởi các hệ điều hành giống như Unix. (có một báo trước cho Mac OS X: bạn phải #define _XOPEN_SOURCE trước khi #including tiêu đề có liên quan.) Lý do khiến chúng trở nên lỗi thời cũng khá lame - chúng có thể thay thế chúng bằng phiên bản giống như pthread, nơi con trỏ hàm mất một đối số void * duy nhất.

Như bạn nói, chủ đề không phải là một thay thế hữu ích, vì vậy tôi sẽ tiếp tục và sử dụng swapcontext(). Bạn cũng có thể tìm thấy this blog post thú vị để cuộn phiên bản chức năng của riêng bạn.

+0

Bài viết thú vị (mặc dù tôi cảm thấy việc sử dụng coroutines tốt nhất có lẽ không dành cho việc cắt thời gian hoặc thời gian ngắn để các chi phí được trích dẫn có thể là trường hợp xấu nhất). Dù sao, chỉ cần thêm rằng tôi tránh ném ngoại lệ và nếu không thì không có vấn đề gì khi sử dụng make/swapcontext (và các sợi Windows ditto) trong một dự án [C++] (http://code.google.com/p/crag/source/browse/ src/smp/FiberPosix.cpp). –

Các vấn đề liên quan