[英]Why is Boost scoped_lock not unlocking the mutex?
我一直以這種方式使用boost::mutex::scoped_lock
:
void ClassName::FunctionName()
{
{
boost::mutex::scoped_lock scopedLock(mutex_);
//do stuff
waitBoolean=true;
}
while(waitBoolean == true ){
sleep(1);
}
//get on with the thread's activities
}
基本上,它設置了waitBoolean,其他線程則通過將waitBoolean設置為false來表明已完成。
但是,這似乎不起作用,因為另一個線程無法鎖定互斥鎖!
我假設通過將scoped_lock括在方括號中來終止其鎖定。 不是這樣嗎 在線閱讀說,只有在調用析構函數時,它才會放棄互斥量。 它超出當地范圍時是否會被銷毀?
信號部分代碼:
while(running_){
boost::mutex::scoped_lock scopedLock(mutex_);
//Run some function that need to be done...
if(waitBoolean){
waitBoolean=false;
}
}
謝謝!
要同步兩個線程,請使用條件變量。 這是按照您想要的方式同步兩個線程的最新方法:
使用boost,等待的部分是這樣的:
void BoostSynchronisationPoint::waitSynchronisation()
{
boost::unique_lock<boost::mutex> lock(_mutex);
_synchronisationSent = false;
while(!_synchronisationSent)
{
_condition.wait(lock); // unlock and wait
}
}
通知部分類似於:
void BoostSynchronisationPoint::sendSynchronisation()
{
{
boost::lock_guard<boost::mutex> lock(_mutex);
_synchronisationSent = true;
}
_condition.notify_all();
}
使用_synchronisationSent進行業務是避免突然喚醒:請參閱Wikipedia
實際上,scoped_lock應該在作用域的末尾釋放。 但是,當您在其上循環時,請不要鎖定waitBoolean,這表明您在其他地方也沒有適當地保護它-例如,在將其設置為false的地方,最終會遇到討厭的競爭條件。
我想說你應該使用boost :: condition_variable來做這種事情,而不是睡眠+線程不安全的檢查。
我也建議將waitBoolean標記為volatile,但是您必須使用條件甚至更好的障礙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.