Вот что я знаю до сих пор:
1. Несколько обработчиков выполняются в нескольких потоках.
2. Обработчики работают независимо друг от друга.Для потоков данных / условий не требуется синхронизация между потоками.
3. Get может вызываться любым обработчиком.При вызове обработчик должен прекратить вычисление и позволить другому потоку вызывать handler :: get ().
Это действительно больше похоже на вопрос о многопоточности / параллелизме, чем вопрос boost :: asio.На данный момент я не вижу необходимости использовать io_service.Похоже, что несколько потоков могут быть запущены без io_service, и между потоками может быть использована некоторая синхронизация.
Поток, вызывающий Handler :: get (), должен ждать, пока оператор выполнения потока io_service () не завершитвычисление до того, как оно может вернуться.
Рассмотрите возможность использования условной переменной.Метод handler :: get () может подождать, пока условие не будет выполнено (т. Е. Operator () завершит свой расчет).Поток io_service, который запускает operator (), уведомляет основной поток через условную переменную.
Примером того, как один поток уведомляет другой поток через условную переменную, является здесь .