2011-07-29 7 views
1

私は少しスレッドライブラリに取り組んでおり、問題に遭遇しました。 boost :: condition_variable.wait()は完全に動作しますが、boost :: condition_variable.timed_wait()はただちに戻りますが、タイムアウトしません。boost :: condition_variable.timed_waitすぐに戻る

ドキュメントでは、タイムアウトが経過するか、通知された後にのみ返されるべきだと書かれています。それは通知の前に3秒待っているので、10秒と100秒の両方のタイムアウトを試したので、3秒後に戻るはずです。

EDIT:

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を使用すると、しかし長い間それがなかったに対処するために、あなたのタイムアウトを再計算しなければならないとして、それは少し複雑ですが、実際には、待ってください。それでも問題が解決している場合は、mSendTimeoutはない負のか、非常に小さいことを確認し、使用を検討

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

:ブーストはあなたのためのループを行います、絶対タイムアウトを与え、a variant with a predicate提供しています絶対タイムアウト

+0

ああ、ありがとう。これを撃つだろう。 mSendTimeoutは私がチェックしたもので、その中の変数の1つは間違っていましたが、それを修正しても機能しませんでした。 – dutt

関連する問題