Boost.Asio. Возможность ожидать завершения любого объекта в очереди необходима - PullRequest
0 голосов
/ 02 октября 2010

В asio :: io_service я вставляю объекты.asio :: io_service :: run () работает в нескольких потоках.Возможность ожидать завершения любого объекта в очереди необходима.Например:

template <typename T>
struct handler {
   void operator()() {
      ....
   }
   T get() const {...}
};

asio::io_service ios;
ios.post(handler());
  1. Как я могу обратиться к объекту в очереди?
  2. Как я могу приостановить основной цикл программы, пока не будет выполнен handler :: operator ()?

Спасибо.

1 Ответ

1 голос
/ 04 октября 2010

Вот что я знаю до сих пор:
1. Несколько обработчиков выполняются в нескольких потоках.
2. Обработчики работают независимо друг от друга.Для потоков данных / условий не требуется синхронизация между потоками.
3. Get может вызываться любым обработчиком.При вызове обработчик должен прекратить вычисление и позволить другому потоку вызывать handler :: get ().

Это действительно больше похоже на вопрос о многопоточности / параллелизме, чем вопрос boost :: asio.На данный момент я не вижу необходимости использовать io_service.Похоже, что несколько потоков могут быть запущены без io_service, и между потоками может быть использована некоторая синхронизация.

Поток, вызывающий Handler :: get (), должен ждать, пока оператор выполнения потока io_service () не завершитвычисление до того, как оно может вернуться.

Рассмотрите возможность использования условной переменной.Метод handler :: get () может подождать, пока условие не будет выполнено (т. Е. Operator () завершит свой расчет).Поток io_service, который запускает operator (), уведомляет основной поток через условную переменную.

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

...