繁体   English   中英

unique_lock使用互斥锁有什么特殊用途?

[英]What special purpose does unique_lock have over using a mutex?

我不太清楚为什么std::unique_lock<std::mutex>比使用普通锁std::unique_lock<std::mutex>用。 我正在看的代码中的一个例子是:

{//aquire lock

        std::unique_lock<std::mutex> lock(queue_mutex);

        //add task
        tasks.push_back(std::function<void()>(f));

}//release lock

为什么会偏爱

queue_mutex.lock();

//add task
//...

queue_mutex.unlock();

这些代码片段完成同样的事情吗?

[Do]这些代码片段完成了同样的事情吗?

没有。

无论块是什么,第一个将在块的末尾释放锁。 如果关键部分退出breakcontinuereturngoto ,异常或任何其他我忘记的非本地跳转,则第二个不会释放锁定。

使用unique_lock可以在面临变化和错误时提供弹性。

  • 如果更改流程以添加中间“跳转”(例如return
  • 如果抛出异常
  • ...

在任何情况下,锁都会自动释放。

另一方面,如果您尝试手动执行此操作,则可能会错过一个案例。 即使你现在没有,稍后的编辑可能会。


注意:这是C ++中常用的习惯用法,称为SBRM(Scoped Bound Resources Management),您可以将清理操作绑定到堆栈展开,这样您就可以确保,除非崩溃/不正常退出,否则执行它。

它还显示了RAII(资源获取是初始化),因为unique_lock构造获取了资源(这里是互斥锁)。 尽管它的名字,这个首字母缩略词也通俗地用于指破坏时的确定性释放,它涵盖了比SBRM更广泛的范围,因为它涉及所有类型的确定性释放,而不仅仅是基于堆栈展开的那些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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