繁体   English   中英

在scoped_lock上解锁的无关紧要

[英]Extraneous call to unlock on scoped_lock

在以下博文中:

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

有一个'推送'方法定义如下:

void push(Data const& data)
{
   boost::mutex::scoped_lock lock(the_mutex);
   the_queue.push(data);
   lock.unlock();
   the_condition_variable.notify_one();
}

我的问题是:

  1. 为什么在scoped_lock变量上调用了一个显式的'lock.unlock()'?

  2. 它的目的是什么?

  3. 是否可以安全删除,导致'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM