CppCoreGuidelines CP.43 减少关键代码执行路径中时间的消耗
06 July 2023
“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()
。