C++ 是C++;11互斥仅使用静态初始化?

C++ 是C++;11互斥仅使用静态初始化?,c++,multithreading,c++11,mutex,C++,Multithreading,C++11,Mutex,C++11标准是否保证互斥不使用动态初始化?例如,如果我们声明一个互斥类型的全局变量,然后在另一个TU中的另一个全局变量的构造函数中使用它,那么构造顺序会成为一个问题吗?当然会。在任何情况下,如果您在程序的启动阶段(即,main()调用之前)谈论全局变量之间的交互,这都是一个问题 另外,如果它可以被零初始化(与它的确切含义无关),那么初始化将在互斥体本身的构造过程中发生,因此构造顺序将是一个问题。您使用的不精确语言在这里令人困惑。术语“零初始化”在标准中具有特定含义,不适用于互斥,也不适用于您声

C++11标准是否保证互斥不使用动态初始化?例如,如果我们声明一个互斥类型的全局变量,然后在另一个TU中的另一个全局变量的构造函数中使用它,那么构造顺序会成为一个问题吗?

当然会。在任何情况下,如果您在程序的启动阶段(即,
main
()调用之前)谈论全局变量之间的交互,这都是一个问题


另外,如果它可以被零初始化(与它的确切含义无关),那么初始化将在互斥体本身的构造过程中发生,因此构造顺序将是一个问题。

您使用的不精确语言在这里令人困惑。术语“零初始化”在标准中具有特定含义,不适用于
互斥
,也不适用于您声明的用例

因此,让我们通过查看您的示例,了解您真正想要的是什么:

如果我们声明一个互斥类型的全局变量,然后在 另一个CU中另一个全局变量的构造函数 这里的建筑业是个问题吗

我们在这里仍然有点模糊,非成员变量初始化的规则是微妙的,所以我将总结一下我认为是一般合理的建议

一般来说,不要依赖非成员变量的初始化顺序。


这是一个不使用全局变量的好理由,只要你能避免它。

你说的“零初始化”是什么意思?该标准保证互斥锁被构造为未锁定的,就是这样。@Cicada,我有一个问题,因为Google的spinlock能够进行链接器_初始化:因此它甚至在任何构造函数运行之前就被初始化了,因此,全局变量的构造函数可以在不考虑构造函数顺序的情况下使用。您是指静态初始化吗?@T.C.:除了30.4.1.2.1[thread.mutex.class]中给出的一个之外;-)@然而,在特定平台上进行测试是有用的,但我这里的问题的主要目的是确保我的用例得到标准的认可,所以我不必担心它将来会崩溃,即使它目前可以工作。零初始化是标准的一个精确定义的术语,而不是一些模糊的东西。通过说零初始化,我的意思是它是在程序加载时初始化的。就像定义一个全局变量
inta=0
将在任何构造函数运行之前使
a
初始化。我有这个问题是因为Google的SpinLock实现具有以下功能:@Deduplicator,抱歉,我知道整数或指针应该初始化为零,但这对互斥对象意味着什么?请参阅[basic.start.init]和[dcl.init]。谢谢,那么,如果我想说某个类在零初始化或常量初始化后已经处于有效状态,这样它就可以被另一个全局变量的构造函数使用,那么我应该使用什么标准术语呢?@icando:问问静态初始化对该类是否足够。无论如何,您可能需要阅读[basic.start.init]和[dcl.init]。@Deduplicator,标准太正式了。在阅读了您指出的一些章节之后,我有了一种感觉,因为std::mutex有一个constexpr默认构造函数,所以我的用例在这里受到了标准的祝福?我读对了吗?@icando是的,在静态初始化过程中,
std::mutex
被完全初始化,因为ctor是
constexpr
@Deduplicator,你介意写一个答案让我接受吗?这一个是完全离题的,不正确的IMHO,因为它谈到了一般情况,并对我的用例说“不”,但我特别问了std::mutex,根据您的评论和C++11标准,它实际上是“是”。