C ++ 11引入了线程安全的本地静态初始化,又称"魔法静态":Is local static variable initialization thread-safe in C++11?
特别是,规范说:
如果控件在变量的同时进入声明 在初始化时,并发执行应等待完成 初始化。
所以这里有一个隐含的互斥锁。这非常有趣,看起来像是一个异常 - 也就是说,我不知道c ++中内置的任何其他隐式互斥量(即互斥语义没有使用像std :: mutex这样的东西)。还有其他的,或者在规范中这是独一无二的吗?
我也很好奇魔术静态的隐式互斥(或其他隐式互斥,如果有的话)是否可以用来实现其他同步原语。例如,我看到它们可用于实现std :: call_once,因为:
std::call_once(onceflag, some_function);
可表示为:
static int dummy = (some_function(), 0);
但请注意,魔术静态版本比std :: call_once更受限制,因为使用std :: call_once可以重新初始化一次标志,因此每个程序执行时多次使用代码,而使用魔法静态,你实际上每次执行程序只能使用它一次。
这是我能想到的唯一一些不明显的魔法静力学用途。
是否可以使用magic static的隐式互斥锁来实现其他同步原语,例如:一般的std :: mutex,还是其他有用的东西?
答案 0 :(得分:1)
块范围static
变量的初始化是语言需要同步的唯一位置。一些库函数需要同步,但不是直接同步函数(例如atexit
)。
由于本地static
初始化的同步是一次性事件,因此每次需要时,在其上实现通用同步机制即使不是不可能也很难。您需要初始化不同的本地static
对象的同步点。
虽然在某些情况下可以使用它们代替call_once
,但它们不能用作它的一般替代品,因为可以在许多地方使用给定的once_flag
对象