2012-01-27 50 views
1

我有升壓條件的問題,我有一個CPP類內這兩個實例變量:助推條件問題?

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

然後我有發送信息,並用於狀況的方法:

方法1

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(); 

兩個方法被稱爲在不同的線程。問題是,當調用method2時,在調用「wait_answer_condition.notify_one()」之前釋放wait_answer_condition,並且method1被喚醒而未找到結果。

任何人都有這個想法?

+0

根據http://www.boost.org/doc/libs/1_48_0/doc/html/thread/synchronization.html#thread.synchronization。 condvar_ref我認爲這種行爲的目的是 - 你忘了鎖定線程 – tuergeist 2012-01-27 13:10:02

+0

也與我鎖的山姆結果。這種情況的反應是等待狀態的虛假行爲。見thiton答案。 – Macdeveloper 2012-01-28 08:10:14

回答

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

我會把你最後一句話改爲「因此,條件變量應該總是在循環中使用」,另請參閱(而不是增加)http://stackoverflow.com/questions/5536759/condition-variable-why-calling-pthread- COND信號前方的呼喚 - 並行線程-CO/5538447#5538447 – stefaanv 2012-01-27 13:26:23