确保静态布尔检查的线程安全性

时间:2019-10-13 13:58:29

标签: c++ multithreading thread-safety locking

在我的代码中多次出现的模式是需要调用某个初始化函数的函数,当前可通过以下方法解决

void doSomething(){
    static bool _isInitialized = false;
    if( ! _isInitialized ){
        initializationFunction();
        _isInitialized = true;
    }
    ...
}

据我所知,这种功能不是线程安全的,因为它可能会发生一个线程正在执行initializationFunction,而另一个线程会在_isInitialized设置为true之前开始执行此操作。

我是编写多线程代码的新手,并且想知道哪种方法可以使此类代码具有线程安全性。一种可能的解决方案似乎是在此代码周围加锁,但我宁愿避免使用锁。还有另一种(更好)的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

假设initializationFunction的签名取决于某个第三方(如注释中所建议),那么您可以执行以下操作...

void doSomething ()
{
    static bool _isInitialized =
        []()
        {
            initializationFunction();
            return true;
        }();
}

答案 1 :(得分:1)

如“一些程序员伙计”所建议的那样,可能的解决方案是使用std :: call_once。然后可以将代码重写为:

void doSomething(){
    static std::once_flag flag;
    std::call_once( initializationFunction, flag );
    ...
}