我不太确定为什么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更广泛的范围,因为它指的是所有类型的确定性释放,而不仅仅是那些基于堆栈展开的确定性释放。