我不太清楚为什么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();
这些代码片段能完成同样的事情吗?
答案 0 :(得分:19)
[Do]这些代码片段完成同样的事情吗?
没有
第一个将在块的末尾释放锁定,无论块是什么。如果使用break
,continue
,return
,goto
,例外或任何其他类型的非关键部分退出,则第二部分不会在结尾处释放锁定 - 我忘记的本地跳跃。
答案 1 :(得分:5)
使用unique_lock
可以在面临变更和错误时提供弹性。
return
)在任何情况下,锁都会自动释放。
另一方面,如果您尝试手动执行此操作,则可能会错过一个案例。即使你现在没有,也可以稍后进行编辑。
注意:这是C ++中常用的习惯用法,称为SBRM(Scoped Bound Resources Management),您可以将清理操作绑定到堆栈展开,这样您就可以确保,除非崩溃/不正常退出,否则执行
它还展示了RAII(资源获取是初始化),因为unique_lock
的构造获得了资源(这里是互斥体)。尽管它的名字,这个首字母缩写也通常用于指破坏时的确定性释放,它涵盖了比SBRM更广泛的范围,因为它指的是所有类型的确定性释放,而不仅仅是基于堆栈展开的那些