【问题标题】:Why is Boost scoped_lock not unlocking the mutex?为什么 Boost scoped_lock 不解锁互斥锁?
【发布时间】:2010-11-18 09:07:12
【问题描述】:

我一直以这种方式使用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来表示它已完成;

然而,这似乎不起作用,因为其他线程无法锁定 mutex_ !!

我假设通过将 scoped_lock 括在括号中,我将终止它的锁定。不是这样吗?在线阅读说它只有在调用析构函数时才放弃互斥锁。当它超出本地范围时,它不会被销毁吗?

信号部分代码:

while(running_){
   boost::mutex::scoped_lock scopedLock(mutex_);
   //Run some function that need to be done...
   if(waitBoolean){
      waitBoolean=false;
   }
}

谢谢!

【问题讨论】:

  • scoped_lock 对象在右括号处被销毁,互斥锁被释放。请张贴代码的信号部分。顺便说一句, boost::condition_variable 更适合您的需求
  • 好吧,看看你的信号代码,它可以在某些情况下工作,但取决于你所做的处理(你的 cmets)。如果有其他同步,那就更糟了。条件变量就是这样做的方法。我已经发布了我用来做这种同步的代码。
  • 信号线程的“工作”不会锁定其他任何东西。它独立运行。

标签: c++ multithreading boost mutex


【解决方案1】:

要同步两个线程,请使用条件变量。这是以您想要的方式同步两个线程的最先进的方式:

使用 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

【讨论】:

    【解决方案2】:

    scoped_lock 确实应该在作用域结束时释放。但是,当您循环它时,您不会锁定 waitBoolean,这表明您在其他地方也没有正确保护它 - 例如如果设置为 false,您最终会遇到令人讨厌的竞争条件。

    我会说你应该使用 boost::condition_variable 来做这种事情,而不是 sleep + 线程不安全检查。

    【讨论】:

      【解决方案3】:

      我还建议将 waitBoolean 标记为 volatile,但是您必须使用条件甚至更好的屏障。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-23
        • 2022-06-13
        • 2010-11-22
        • 1970-01-01
        • 2022-07-31
        • 2012-12-25
        • 2014-02-28
        相关资源
        最近更新 更多