06 July 2023

C++ 核心指南目录

“Minimize time spent in a critical section”

理由

线程锁住互斥锁的时间越短,其他线程等待的时间也就越少。线程挂起和恢复的成本很高。

例子

void do_something() // bad
{
    unique_lock<mutex> lck(my_lock);
    do0();  // preparation: does not need lock
    do1();  // transaction: needs locking
    do2();  // cleanup: does not need locking
}

这里,我们锁住互斥锁的时间有点太多了:我们不该在需要互斥锁之前锁住它。我们应该在不需要互斥锁的时候马上释放。我们可以这么改进:

void do_something() // bad
{
    do0();  // preparation: does not need lock
    my_lock.lock();
    do1();  // transaction: needs locking
    my_lock.unlock();
    do2();  // cleanup: does not need locking
}

但是,这里违反了 RAII 规则,不太安全。我们可以添加一个代码块:

void do_something() // OK
{
    do0();  // preparation: does not need lock
    {
        unique_lock<mutex> lck(my_lock);
        do1();  // transaction: needs locking
    }
    do2();  // cleanup: does not need locking
}

强化

一般来说比较难。可以标记“裸露”的 lock()unlock()