繁体   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