[英]what does unique_lock mean when a single thread acquire 2 unique_lock of the same mutex?
[英]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]这些代码片段完成了同样的事情吗?
没有。
无论块是什么,第一个将在块的末尾释放锁。 如果关键部分退出break
, continue
, return
, goto
,异常或任何其他我忘记的非本地跳转,则第二个不会释放锁定。
使用unique_lock
可以在面临变化和错误时提供弹性。
return
) 在任何情况下,锁都会自动释放。
另一方面,如果您尝试手动执行此操作,则可能会错过一个案例。 即使你现在没有,稍后的编辑可能会。
注意:这是C ++中常用的习惯用法,称为SBRM(Scoped Bound Resources Management),您可以将清理操作绑定到堆栈展开,这样您就可以确保,除非崩溃/不正常退出,否则执行它。
它还显示了RAII(资源获取是初始化),因为unique_lock
构造获取了资源(这里是互斥锁)。 尽管它的名字,这个首字母缩略词也通俗地用于指破坏时的确定性释放,它涵盖了比SBRM更广泛的范围,因为它涉及所有类型的确定性释放,而不仅仅是基于堆栈展开的那些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.