c++pthreadsboost-asioboost-threadconcurrent-programming

boost asio asynchronously waiting on a condition variable


Is it possible to perform an asynchronous wait (read : non-blocking) on a conditional variable in boost::asio ? if it isn't directly supported any hints on implementing it would be appreciated.

I could implement a timer and fire a wakeup even every few ms, but this is approach is vastly inferior, I find it hard to believe that condition variable synchronization is not implemented / documented.


Solution

  • If I understand the intent correctly, you want to launch an event handler, when some condition variable is signaled, in context of asio thread pool? I think it would be sufficient to wait on the condition variable in the beginning of the handler, and io_service::post() itself back in the pool in the end, something of this sort:

    #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();
    }