与使用互斥锁相比,unique_lock有什么特殊用途?

What special purpose does unique_lock have over using a mutex?

本文关键字:什么 lock unique      更新时间:2023-10-16

我不太确定为什么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();

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

[做]这些代码片段完成相同的事情吗?

无论block是什么,第一个都会在block结束时释放锁。如果临界区以break, continue, return, goto,异常或我忘记的任何其他类型的非本地跳转退出,则第二个将不会在结束时释放锁。

使用unique_lock可以在面对更改和错误时提供弹性。

  • 如果你改变流添加中间的"跳跃"(return为例)
  • 如果抛出异常

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

另一方面,如果您尝试手动执行,则可能会错过一个案例。即使你现在不这样做,以后的编辑可能会。


注意:这是c++中常用的习惯用法,称为SBRM (Scoped Bound Resources Management),在这里你可以绑定一个清理操作来展开堆栈,这样你就可以确保,除非崩溃/不优雅退出,否则它会被执行。

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