7

boost :: asioの条件変数で非同期待機(読み取り:ノンブロッキング)を実行できますか?それが直接サポートされていない場合、それを実装する上でのヒントは認められるでしょう。boost asioは条件変数で非同期的に待機します

私はタイマーを実装して数ミリ秒ごとに起床することもできますが、これはアプローチが大幅に劣っているため、条件変数の同期化が実装/記録されていないとは考えにくいです。

+0

が何をやりたいですか? - おそらく、あなたが探しているものの[async_read_until](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/async_read_until.html)の最後のバージョンですか?ノンブロッキング待機は、通常、[boost thread](http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html)のタスクです... boost asioとの組み合わせでスレッドを有効にする必要があります... – jenseb

+0

私は別の実装を念頭に置いて、別の質問でここで概説しました。 http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfcこれは、あなたが私が何をしたいのかについてより多くの洞察を与えるかもしれません。 –

答えて

7

私が意図を正しく理解していれば、いくつかの条件変数がシグナルされたときに、イベントハンドラを起動したいと思っています。私はハンドラの先頭で条件変数を待つのに十分だろうと思うし、この種の最後にプール、何かで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(); 
} 
+4

しかし、待機しているスレッドはブロックされますが、スレッドをブロックしない代わりに補完ハンドラを登録する方法はありませんか?私は現在、ここでは代替メカニズムをコンシデントしています。http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc –

+0

@Hassan Syed:条件変数は、ブロックされたスレッド代わりに非同期信号を探しているのでしょうか? boost.asioはシグナルハンドラのサポートを1.47.0で追加しました:http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/history.html – Cubbi

+0

私が知る限り、これらはシグナルですオペレーティングシステムによって発行されます。これらの信号に登録できることが示されていますが、それを放出するのはOSです。 –

関連する問題