07 July 2023

C++ 核心指南目录

“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_guardunique_lock