首页 > 解决方案 > 确保静态布尔检查的线程安全

问题描述

我的代码中出现多次的一个模式是需要调用某个初始化函数的函数,目前解决如下

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

然而,据我所知,这种函数不是线程安全的,因为在设置为 trueinitializationFunction之前,可能会发生一个线程正在执行而另一个线程开始执行相同的操作。_isInitialized

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

标签: c++multithreadingthread-safetylocking

解决方案


假设签名由initializationFunction某个第三方决定(如评论中所建议),那么您可以执行类似...

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

推荐阅读