簡體   English   中英

為什么Boost scoped_lock無法解鎖互斥鎖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM