Поточно-безопасные сопрограммы с asio

Могу ли я иметь потокобезопасные сопрограммы вместе с boost :: asio?

Я хочу, чтобы один io_service работал в нескольких потоках и имел некоторые из моих обработчиков будут сопрограммы.

Boost.Coroutine может показаться решением, но они документ не поддерживают возобновление сопрограммы, которая была запущена в отдельном потоке.

Насколько мне известно, есть только два возможных решения этой проблемы:

  1. Не используйте сопрограммы. Используйте гораздо более подробный (даже с лямбда-выражением), но не менее функциональный метод объединения обратных вызовов, сохраняющих состояние.
  2. Заставить каждый обработчик работать только в одном потоке. Я знаю, что это возможно, просто имея отдельный io_service для каждого потока.Кстати, есть ли простой способ, аналогичный io_service :: strand, заставить набор обработчиков работать в одном потоке?

Ни то, ни другое не является хорошими решениями. В одном решении я теряю сопрограммы. В другом я теряю большую часть своей способности к многопоточности.

8
задан Lalaland 10 September 2013 в 19:21
поделиться