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