2011-07-29 83 views
1

我正在研究一個小線程庫,並且遇到了問題。 boost :: condition_variable.wait()完美工作,但boost :: condition_variable.timed_wait()立即返回,它不會超時。boost :: condition_variable.timed_wait立即返回

該文檔說,它應該只在超時已過或已通知時返回。這是一個三秒鐘等待通知之前,我已經嘗試了10秒和100秒的時間,所以它應該在3秒後返回。

編輯:

boost::condition_variable waitCondition; 
boost::mutex mMutex; 

Message MessageClient::waitAsync(Message msg, bool waitForReply) { 
    unique_lock<boost::mutex> lock(msg->mMutex); 
    if(mSendTimeout.sec == 0) 
     msg->waitCondition.wait(lock); 
    else { 
     timeout = msg->waitCondition.timed_wait(lock, mSendTimeout); 
     if(!timeout) 
      return 0; 

     if(waitForReply) { 
      Message reply = receiveMessage(); 
      return reply; 
     } 
     else 
      return 0; 
} 

這是一個的sendMessage後調用。接收器得到的消息,發送回覆,然後調用

waitCondition.notify_all(); 
+0

夠用了,代碼加了 – dutt

回答

4

條件變量等待可以occasionally result in spurious wakeups。因此,你必須在一個環路使用它們:

while (someCondition) 
    msg->waitCondition.wait(lock); 

隨着TIMED_WAIT這是稍微複雜一些,你必須重新計算你的超時處理但長時間沒有,事實上,等待。升壓提供a variant with a predicate,有這樣的絕對超時,會做循環爲您提供:

msg->waitCondition.timed_wait(lock, absoluteTimeout, boost::lambda::var(someFlag)); 

如果你仍然有問題,檢查mSendTimeout不爲負或非常小,考慮使用的絕對超時。

+0

啊,謝謝。會給這個鏡頭。 mSendTimeout是我檢查過的東西,其中的一個變量是錯誤的,但修復它並沒有使它工作。 – dutt