在我的代码中多次出现的模式是需要调用某个初始化函数的函数,当前可通过以下方法解决
void doSomething(){
static bool _isInitialized = false;
if( ! _isInitialized ){
initializationFunction();
_isInitialized = true;
}
...
}
据我所知,这种功能不是线程安全的,因为它可能会发生一个线程正在执行initializationFunction
,而另一个线程会在_isInitialized
设置为true之前开始执行此操作。
我是编写多线程代码的新手,并且想知道哪种方法可以使此类代码具有线程安全性。一种可能的解决方案似乎是在此代码周围加锁,但我宁愿避免使用锁。还有另一种(更好)的方法来解决这个问题吗?
答案 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 );
...
}