[英]Extraneous call to unlock on scoped_lock
在以下博文中:
有一个'推送'方法定义如下:
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
我的问题是:
为什么在scoped_lock变量上调用了一个显式的'lock.unlock()'?
它的目的是什么?
是否可以安全删除,导致'notify_one'方法调用在scoped_mutex的范围内?
解锁不是必需的。 但是,它可能会减少互斥锁被锁定的时间。
保留或移除它不会影响线程安全或导致死锁。
编辑:正如文章提到的那样,将解锁保留在那里可以减少对互斥锁的争用。 您也可以将其保留。或者,在互斥锁周围使用范围,我个人发现,如果查看代码,我会更好地突出显示互斥锁的范围。
显式锁是这样的,等待线程不被通知唤醒,只是必须阻塞互斥锁。 这在前面链接到的文章中有解释。
仍然使用scoped_lock
的原因是为了确保在推送失败的情况下正确解锁互斥锁并抛出异常。
第1点和第2点可以通过以下原则回答:您应该尽可能少地握住锁。 一旦数据被推入队列,您就不再需要锁定它。
您可以按照建议移除解锁,但需要将锁定保持更长时间。
或者,可以通过添加新范围来删除解锁本身,如下所示:
void push(Data const& data)
{
{ // new scope
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
} // scope ends, lock gets destroyed
the_condition_variable.notify_one();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.