我最近开始学习 C++ 中的不同锁定机制。我很好奇 const 锁是如何工作的。
std::mutex m;
int a = 10;
void func(){
const std::unique_lock lck(m);
a += 10;
std::cout << "a: " << a << "\n";
}
如果我有一个像下面这样的函数,如果我使用或不使用
const
会有什么区别?
它是否有效或建议使用 const std::unique_lock
?如果是,这可能有什么用例?
将
const
与 std::unique_lock
或 std::shared_lock
一起使用是有效的,但是,它在某种程度上违背了使用这些类型的目的。
即使在 std::shared_lock
时,也可以复制 const
(因此与其他人共享所有权),但是 std::unique_lock
不能转移到其他地方,因为移动构造函数采用 std::unique_lock<M>&&
,并且这样的右值引用无法绑定到 const
锁。
还应该注意的是,无法调用任何不适用于 lock()
对象的成员函数,例如 unlock()
、const
等。
如果您确实坚持在这里使用
const std::unique_lock
,则更愿意使用 std::scoped_lock
,而不是 const
。
一般来说,std::unique_lock
告诉读者您有兴趣转让所有权,如果您实际上不这样做,就会产生误导。
就个人而言,我建议永远不要创建互斥体、锁和其他线程原语
const
,因为它们在代码中永远不会扮演“常量”的角色。
他们是否与 const
合作也不清楚;不然你就不会问这个问题了:)
std::lock_guard
。然而,这种锁应该避免,因为它已经被 std::scoped_lock
废弃了。