CppCoreGuidelines CP.44 给 lock_guard, unique_lock 声明变量
07 July 2023
“Remember to name your lock_guard
s and unique_lock
s”
理由
例子
// global mutexes mutex m1; mutex m2; void f() { unique_lock<mutex>(m1); // (A) lock_guard<mutex> {m2}; // (B) // do work in critical section ... }
看起来很正常。但是是不对的。在 (A) 处, m1
是默认构造的局部
unique_lock
,它会遮盖掉全局的 ::m1
这样也就不会锁住 ::m1
。在 (B) 处,构造了一个匿名的临时 lock_guard
并且锁住 ::m2
,但是立即走出了作用域范围,马上释放了 ::m2
。对于 f()
函数的其他部分来说,并没有锁住任何互斥锁。
强化
标记所有匿名的 lock_guard
和 unique_lock