确保静态布尔检查的线程安全
Ensure thread-safety of static boolean check
在我的代码中多次出现的一个模式是一个函数需要调用某个初始化函数,目前解决如下
void doSomething(){
static bool _isInitialized = false;
if( ! _isInitialized ){
initializationFunction();
_isInitialized = true;
}
...
}
然而,据我所知,这种函数不是线程安全的,因为可能会发生一个线程正在执行 initializationFunction
而另一个线程在 _isInitialized
设置为之前开始执行相同的操作是的。
我是编写多线程代码的新手,想知道什么是使此类代码线程安全的好方法。一种可能的解决方案似乎是对该代码加锁,但我宁愿避免使用锁。还有其他(更好的)方法可以解决这个问题吗?
正如 'Some programmer dude' 所建议的,一个可能的解决方案是使用 std::call_once。然后可以将代码重写为:
void doSomething(){
static std::once_flag flag;
std::call_once( initializationFunction, flag );
...
}
假设 initializationFunction
的签名由某个第三方决定(如评论中所建议的),那么您可以做类似...
void doSomething ()
{
static bool _isInitialized =
[]()
{
initializationFunction();
return true;
}();
}
在我的代码中多次出现的一个模式是一个函数需要调用某个初始化函数,目前解决如下
void doSomething(){
static bool _isInitialized = false;
if( ! _isInitialized ){
initializationFunction();
_isInitialized = true;
}
...
}
然而,据我所知,这种函数不是线程安全的,因为可能会发生一个线程正在执行 initializationFunction
而另一个线程在 _isInitialized
设置为之前开始执行相同的操作是的。
我是编写多线程代码的新手,想知道什么是使此类代码线程安全的好方法。一种可能的解决方案似乎是对该代码加锁,但我宁愿避免使用锁。还有其他(更好的)方法可以解决这个问题吗?
正如 'Some programmer dude' 所建议的,一个可能的解决方案是使用 std::call_once。然后可以将代码重写为:
void doSomething(){
static std::once_flag flag;
std::call_once( initializationFunction, flag );
...
}
假设 initializationFunction
的签名由某个第三方决定(如评论中所建议的),那么您可以做类似...
void doSomething ()
{
static bool _isInitialized =
[]()
{
initializationFunction();
return true;
}();
}