为什么C 17中的全局内线变量和静态内线成员需要警卫



以来,由于C 17,可以使用inline关键字在标题中初始化全局变量和静态成员。虽然我知道为什么需要对函数中的静态变量进行保护(因为初始化甚至在多线程上下文中也只能发生一次(,但我不明白为什么这些新的内联变量也会受到保护(您可以在这里看到它:https://https://https://godbolt.org/z/yf8peq(。我认为,在任何情况下,所有全球群体和静态成员的初始化都发生在程序执行开始时(甚至在main()之前(,因此目前无需考虑多个线程。你能解释一下吗?

每个包含定义并使用它的文件都将尝试初始化变量。即使这种情况是串行发生的,而不是同时发生的,您仍然需要一种将变量标记为初始化的方法,以便只有第一个出现才能初始化它,然后以后尝试初始化它不会做任何事情。

另外,您可以在main启动之前具有多个线程。全局变量的构造函数(以及这些构造函数调用的函数(可以产生新线程。

因此,您可以拥有多个代码,所有代码都可以在main之前执行,所有代码都试图初始化相同的变量。这就是守卫的目的。

最新更新