2013-09-24 156 views
1

我正在尋找一種方法讓線程等待,直到條件滿足。類似於boost :: condition_variable。但是,如果沒有另一個線程通知當前線程,我希望在滿足條件時喚醒當前線程。Boost線程等待條件

我現在擁有: 有沒有更好的方法來做到這一點?

 int i = 100;//keep connection alive for 500*100 ms (roughly 1 minute) 
     while (!tcp_socket.available() && (i != 0)) 
     { 
      if(!tcp_socket.isOpen()) 
      { 
        break; 
      } 
      i--; 
      boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
     } 
     if (tcp_socket.available())//data available to read? 
     { 
      //read data do stuff 

     } 
+0

你看過[Boost ASIO](http://www.boost.org/doc/libs/release/doc/html/boost_asio.html)嗎?這似乎更貼切一點,至少在你的例子中。 –

+0

我想你有兩個選擇,用繁忙的循環輪詢變量,或者用你不喜歡的通知方法推送它。 – andre

回答

0

您需要有人通知您。

通常情況下,有人應該做誰的工作,將使你等待的條件成爲現實。在網絡I/O(例如您的示例中給出的網絡I/O)的情況下,某人將成爲操作系統:您請求由操作系統執行的套接字操作。一旦該操作完成,系統需要通知您的線程它可以繼續。

正如指出的傑裏棺材的意見,Boost.Asio爲這種情況提供了一個強大的抽象,使您不必與特定系統API調用自己搗鼓。