与使用互斥锁相比,unique_lock有什么特殊用途?
What special purpose does unique_lock have over using a 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();
这些代码片段完成相同的事情吗?
号[做]这些代码片段完成相同的事情吗?
无论block是什么,第一个都会在block结束时释放锁。如果临界区以break
, continue
, return
, goto
,异常或我忘记的任何其他类型的非本地跳转退出,则第二个将不会在结束时释放锁。
使用unique_lock
可以在面对更改和错误时提供弹性。
- 如果你改变流添加中间的"跳跃"(
return
为例) - 如果抛出异常
- …
在任何情况下,锁都被自动释放。
另一方面,如果您尝试手动执行,则可能会错过一个案例。即使你现在不这样做,以后的编辑可能会。
注意:这是c++中常用的习惯用法,称为SBRM (Scoped Bound Resources Management),在这里你可以绑定一个清理操作来展开堆栈,这样你就可以确保,除非崩溃/不优雅退出,否则它会被执行。
它还显示了RAII(资源获取是初始化),因为unique_lock
的构造获取了资源(这里是互斥锁)。尽管它的名字,这个缩略词也通常用于指销毁时的确定性释放,它涵盖了比SBRM更广泛的范围,因为它指的是所有类型的确定性释放,而不仅仅是那些基于堆栈展开的确定性释放。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- "mutex"和"lock"有什么区别?
- 什么是更好的 std::lock_guard<std::mutex> lock(std::mutex mutex_var); 或 std::mutex mutex_var.lock();
- C++std::lock和std::unique_lock之间有什么区别
- 触发 COM 事件时 Lock()/Unlock() 调用的目的是什么?