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

Multithreading 魔法静力学:类似的构造,有趣的非显而易见的用途?,multithreading,c++11,Multithreading,C++11,C++11引入了线程安全本地静态初始化,也称为“魔法静态”: 该规范特别指出: 如果控件在变量为 初始化后,并发执行应等待完成 初始化的一部分 这里有一个隐式互斥锁。这很有趣,而且看起来是一种异常——也就是说,我不知道C++中内置的任何其他隐式互斥(即互斥语义,而不使用任何类似STD::互斥)之类的东西。还有其他的吗,或者这在规范中是唯一的吗 我还想知道是否可以利用magic static的隐式互斥(或者其他隐式互斥,如果有的话)来实现其他同步原语。例如,我发现它们可以用于实现std::call

C++11引入了线程安全本地静态初始化,也称为“魔法静态”:

该规范特别指出:

如果控件在变量为 初始化后,并发执行应等待完成 初始化的一部分

这里有一个隐式互斥锁。这很有趣,而且看起来是一种异常——也就是说,我不知道C++中内置的任何其他隐式互斥(即互斥语义,而不使用任何类似STD::互斥)之类的东西。还有其他的吗,或者这在规范中是唯一的吗

我还想知道是否可以利用magic static的隐式互斥(或者其他隐式互斥,如果有的话)来实现其他同步原语。例如,我发现它们可以用于实现std::call_一次,因为:

std::call_once(onceflag, some_function);
可以这样表示:

static int dummy = (some_function(), 0);
但是,请注意,magic static版本比std::call_once更受限制,因为使用std::call_once可以重新初始化onceflag,从而在每次程序执行时多次使用代码,而使用magic statics,每次程序执行时实际上只使用一次

这是我能想到的唯一一个不太明显的魔法静力学用法


是否可以使用magic static的隐式互斥体来实现其他同步原语,例如通用std::互斥体或其他有用的东西?

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

由于本地
静态
初始化时的同步是一次性的,因此很难(如果不是不可能的话)在其上实现通用同步机制,因为每次需要同步点时,都需要初始化不同的本地
静态
对象

尽管在某些情况下,它们可以用来代替
call\u once
,但它们不能作为通用的替代品,因为给定的
once\u标志
对象可以在许多地方使用