2011-12-19 50 views
8

Có cách nào tôi có thể có coroutines thread an toàn cùng với tăng :: asio?Chủ đề an toàn coroutines với asio

Tôi muốn một io_service để chạy trên nhiều luồng và có một số trình xử lý của tôi là coroutines.

Boost.Coroutine dường như là một giải pháp, nhưng chúng document rằng chúng không hỗ trợ việc tiếp tục một coroutine được bắt đầu trong một chuỗi riêng biệt.

Theo như tôi biết chỉ có hai giải pháp khả thi cho vấn đề này:

  1. Không sử dụng coroutines. Sử dụng nhiều chi tiết hơn (ngay cả với lambda), nhưng phương pháp chức năng giống nhau của chuỗi gọi lại mà lưu trữ nhà nước.
  2. Buộc mỗi trình xử lý chỉ chạy trong một chuỗi. Tôi biết điều này là có thể bằng cách đơn giản có một io_service riêng biệt cho mỗi luồng. Là một sang một bên, là có một cách dễ dàng, tương tự như io_service :: strand, để buộc một bộ xử lý để chạy trong cùng một thread?

Không có giải pháp tốt nào. Trong một giải pháp tôi mất coroutines. Mặt khác, tôi mất hầu hết khả năng đa luồng của mình.

+1

FYI: Bạn đã xem http://blog.think-async.com/2009/08/secret-sauce-revealed.html và http://blog.think-async.com/2010/03/potted- hướng dẫn-to-stackless-coroutines.html? – Ralf

+0

@Ralf Vâng tôi đã thấy điều đó, đó là lý do tại sao tôi hỏi câu hỏi này. Có vẻ như một ý tưởng rất hay và một cách dễ dàng hơn để viết mã không đồng bộ. – Lalaland

Trả lời

3

Dường như vấn đề này không có giải pháp dễ dàng.

Vấn đề lỗi chính có thể do thực tế là C++ cho phép trình biên dịch sắp xếp lại hầu hết những gì xảy ra trong một hàm. Vì vậy, bạn không thể tin cậy phụ thuộc vào thứ tự của những thứ xảy ra trong các chức năng.

Có vẻ như tôi sẽ phải kết thúc bằng cách sử dụng một loạt các cuộc gọi lại, có thể sử dụng lambda nếu tôi có mong muốn giữ mọi thứ tìm kiếm ngữ nghĩa giống như một khối mã.

Có lẽ tôi thậm chí có thể hack thứ gì đó bằng cách sử dụng các macro giải quyết lambdas để mô phỏng phong cách coroutine.

+0

FYI, callbacks là một trình điều khiển tuyệt vời cho các coroutines nếu có một thư viện coroutines chạy phần còn lại của một coroutine từ bên trong gọi lại (https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro .cc). – ArtemGr