18 July 2023

C++ 核心指南目录

“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
    }
};