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

时间:2014-05-27 15:54:13

标签: c++ c++11 threadpool mutex stdthread

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

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

2 个答案:

答案 0 :(得分:19)

  

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

没有

第一个将在块的末尾释放锁定,无论块是什么。如果使用breakcontinuereturngoto,例外或任何其他类型的非关键部分退出,则第二部分不会在结尾处释放锁定 - 我忘记的本地跳跃。

答案 1 :(得分:5)

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

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

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

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


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

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