boost asio асинхронно ожидает переменную условия - PullRequest
7 голосов
/ 21 июля 2011

Можно ли выполнить асинхронное ожидание (читай: неблокирование) условной переменной в boost :: asio?если он не поддерживается напрямую, любые советы по его реализации приветствуются.

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

1 Ответ

7 голосов
/ 21 июля 2011

Если я правильно понимаю намерение, вы хотите запустить обработчик события, когда сигнализируется какая-то переменная условия, в контексте пула потоков asio? Я думаю, что было бы достаточно подождать переменную условия в начале обработчика, и io_service :: post () сам в конце в пуле, что-то вроде этого:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
boost::asio::io_service io;
boost::mutex mx;
boost::condition_variable cv;
void handler()
{
    boost::unique_lock<boost::mutex> lk(mx);
         cv.wait(lk);
    std::cout << "handler awakened\n";
    io.post(handler);
}
void buzzer()
{
    for(;;)
    {
        boost::this_thread::sleep(boost::posix_time::seconds(1));
        boost::lock_guard<boost::mutex> lk(mx);
            cv.notify_all();
    }
}
int main()
{
    io.post(handler);
    boost::thread bt(buzzer);
    io.run();
}
...