11

boost :: asioの条件変数に対して非同期待機(読み取り:非ブロッキング)を実行することは可能ですか?直接サポートされていない場合は、実装に関するヒントをいただければ幸いです。

タイマーを実装して数ミリ秒ごとにウェイクアップを起動することはできますが、これは非常に劣ったアプローチであり、条件変数の同期が実装/文書化されていないことは信じられません。

4

3 に答える 3

7

意図を正しく理解している場合、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();
}
于 2011-07-21T13:18:08.277 に答える