魔法静力学:类似的结构,有趣的非显而易见的用途?

时间:2017-03-21 03:05:47

标签: multithreading c++11

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,还是其他有用的东西?

1 个答案:

答案 0 :(得分:1)

块范围static变量的初始化是语言需要同步的唯一位置。一些库函数需要同步,但不是直接同步函数(例如atexit)。

由于本地static初始化的同步是一次性事件,因此每次需要时,在其上实现通用同步机制即使不是不可能也很难。您需要初始化不同的本地static对象的同步点。

虽然在某些情况下可以使用它们代替call_once,但它们不能用作它的一般替代品,因为可以在许多地方使用给定的once_flag对象