CppCoreGuidelines CP.110 不要自己写双次检查锁的初始化代码
18 July 2023
“Do not write your own double-checked locking for initialization”
理由
从 C++11 开始,静态局部变量是以线程安全的初始化的。结合 RAII 模式,静态局部变量可以替代你自己编写的双次检查锁的初始化代码。 std::call_once
可以实现同样的目的。使用 C++11 静态局部变量或 std::call_once
编写双次检查锁的初始化代码。
例子,使用 std::call_once
void f() { static std::once_flag my_once_flag; std::call_once(my_once_flag, []() { // do this only once }); // ... }
利用 C++ 的线程安全的静态局部变量
void f() { // Assuming the compiler is compliant with C++11 static My_class my_object; // Constructor called only once // ... } class My_class { public: My_class() { // do this only once } };