Поток безопасные сопрограммы с Asio - PullRequest
8 голосов
/ 19 декабря 2011

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

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

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

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

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

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

1 Ответ

3 голосов
/ 22 декабря 2011

Похоже, что у этой проблемы нет простого решения.

Основная проблема, вероятно, связана с тем, что C ++ позволяет компиляторам переупорядочивать большую часть того, что происходит в функции. Таким образом, вы не можете надежно зависеть от порядка вещей, происходящих в функциях.

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

Возможно, я даже смогу что-то взломать, используя макросы, которые преобразуются в лямбды для имитации стиля сопрограммы.

...