const std::unique_lock 或 const std::shared_lock 如何工作

问题描述 投票:0回答:1

我最近开始学习 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
?如果是,这可能有什么用例?

c++
1个回答
0
投票

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
合作也不清楚;不然你就不会问这个问题了:)


注意:如果您不使用 C++17,也可以使用

std::lock_guard
。然而,这种锁应该避免,因为它已经被
std::scoped_lock
废弃了。

© www.soinside.com 2019 - 2024. All rights reserved.