我知道如何使用條件變量(這個構造的混淆名稱,IMO,因爲cv對象既不是變量也不指示條件)。所以,我有一對螺紋,canonically設置了Boost.Thread爲:需要通過條件變量尋找互斥保護(原子)分配?
bool awake = false;
boost::mutex sync;
boost::condition_variable cv;
void thread1()
{
boost::unique_lock<boost::mutex> lock1(sync);
while (!awake)
cv.wait(lock1);
lock1.unlock(); // this line actually not canonical, but why not?
// proceed...
}
void thread2()
{
//...
boost::unique_lock<boost::mutex> lock2;
awake = true;
lock2.unlock();
cv.notify_all();
}
我的問題是:線程2確實需要保護分配給awake
?在我看來notify_all()
調用應該是足夠的。如果被操縱和檢查的數據不僅僅是一個簡單的「可以繼續」標記,我可以看到互斥體中的值,但這裏看起來像是矯枉過正。
問題的第二個問題是在代碼片段中問:爲什麼不在Boost文檔中顯示thread1的鎖在「process data」步驟之前被解鎖?
編輯:也許我的問題是真的:是否有比簡歷更清潔的構造來實現這種等待?
這是記憶同步的事情,讓我絆倒。關於您的最後一點:信號量(通過該名稱)不是Boost或C++ 11線程的一部分; Boost.InterProcess有一個。目前還不清楚它如何更簡單。同樣,我不會爲一個進程使用管道。 – 2012-07-18 19:15:44
@MikeC:沒錯,在Boost或C++線程庫中沒有信號量,就像我的回答說的那樣。從概念上講,信號量或管道可能被認爲是稍微更清潔的,因爲它是單個對象,並且不涉及任何外部共享狀態。就我個人而言,我更喜歡通過消息隊列等進行更高級別的同步,避免顯式共享狀態,但遺憾的是沒有將其納入此版本的標準。 – 2012-07-18 20:08:27