2012-01-27 14 views
1

私はブースト状態に問題がある、私はcppのクラス内のこれらの二つのインスタンス変数を持っている:ブースト状態の問題?

法1

:その後、

boost::condition   wait_answer_condition; 
boost::mutex    wait_answer_mutex; 

私は条件にメッセージを送信するとと方法を持っていますその後、

boost::unique_lock<boost::mutex> lock(wait_answer_mutex) 

//do some work and send message 

//wait the result 
wait_answer_condition.wait(lk); 

//get the result 
result = responseIdSyncMap[currentRequestID]; 

私は結果を受け取り、別の方法を持っていると送信者スレッドをウェイクアップ

方法2

int requestID = responseData->getInt32Value("response_id"); 
responseIdSyncMap.insert(make_pair(requestID, responseData)); 
wait_answer_condition.notify_one(); 

2つの方法は、別のスレッドで呼び出されます。問題は、method2が呼び出されたときにwait_answer_conditionが解放されてからwait_answer_condition.notify_one()が呼び出され、method1が呼び出されて結果が見つからないということです。

誰もがそれについて考えていますか?

+0

http://www.boost.org/doc/libs/1_48_0/doc/html/thread/synchronization.html#thread.synchronizationに記載の方法。 condvar_ref私はこの動作が意図されていると思います - あなたはスレッドをロックアウトするのを忘れました – tuergeist

+0

また、ロックで私はサムの結果を持っていました。それの再現は待ち状態の偽りの振る舞いです。 thitonの答えを参照してください。 – Macdeveloper

答えて

4

条件変数は偽って目を覚ますことがあり、目覚ましイベントは一般的には記憶されません(つまり、人が聞いていないときに誰かが木の中で手錠のように失われるのを待っている前に起きる目覚まし) 。したがって、条件変数は、ほとんど常にループで使用されている:

bool is_answered = false; 

// method1 
boost::lock_guard<boost::mutex> lock(wait_answer_mutex); 
while (! is_answered) 
    wait_answer_condition.wait(lock); 

// method2 
boost::lock_guard<boost::mutex> lock(wait_answer_mutex); 
is_answered = true; 
wait_answer_condition.notify_one(); 
+0

私はあなたの最後の文を "したがって、条件変数は常にループで使用する必要があります"と言い換えることもできます(boostではなく)http://stackoverflow.com/questions/5536759/condition-variable-why-calling-pthread- cond-signal-before-call-pthread-co/5538447#5538447 – stefaanv

関連する問題