C++ 在静态初始化期间,pthread线程变量何时开始存在?

C++ 在静态初始化期间,pthread线程变量何时开始存在?,c++,thread-safety,pthreads,C++,Thread Safety,Pthreads,我正在编写一个程序,它使用静态方法和属性在main之前处理一些事情。语言是C++11 我的问题是,什么时候可以保证线程局部变量(带有pthread)存在?也就是说,在主线程开始之前,我是否可以在主线程的静态初始化中安全地设置线程局部变量?在主线程开始之前,我是否可以在主线程的静态初始化中安全地设置线程局部变量 < > > C++程序设计语言,第四版,Bjarne Stroustrup:< /强> 12.1.8。局部变量 函数中定义的名称通常称为本地名称。 局部变量或常量在执行线程时初始化 达到

我正在编写一个程序,它使用静态方法和属性在main之前处理一些事情。语言是C++11

我的问题是,什么时候可以保证线程局部变量(带有pthread)存在?也就是说,在主线程开始之前,我是否可以在主线程的静态初始化中安全地设置线程局部变量?

在主线程开始之前,我是否可以在主线程的静态初始化中安全地设置线程局部变量

< > > C++程序设计语言,第四版,Bjarne Stroustrup:< /强>

12.1.8。局部变量

函数中定义的名称通常称为本地名称。 局部变量或常量在执行线程时初始化 达到它的定义。除非声明为静态,否则 函数有自己的变量副本。如果局部变量是 声明为静态的,单个静态分配对象(§6.4.2)将 用于在函数的所有调用中表示该变量它 将仅在执行线程第一次到达时初始化 它的定义。例如:…

15.4.1。非局部变量的初始化

非局部(静态分配)变量的初始化是 由实现用于启动应用程序的任何机制控制 C++程序。strong>只有在以下情况下,此机制才能保证正常工作 main()已执行。

尽管您引用的是线程局部变量,但由于初始化代码本身显然是全局的
static
,因此无法保证在
main()
开始运行之前已执行初始化代码,因此如果您有依赖于其他静态的静态,则可能会出现问题

但是一旦执行了
main()
,所有的
static
代码都已初始化。如果是这样,您在
main()
中引用的静态资源将保证可用


如果线程局部变量是在作为静态成员或全局静态的线程变量中声明的,则必须执行
main()
,以便初始化静态线程,并根据声明线程局部变量的方式启动,此时线程本地静态将在到达执行点时初始化。

我担心的变量是线程本地变量。在哪一点上它们被保证存在?这是答案的第一部分:只有当执行线程第一次达到其定义时,它才会被初始化。因此,如果线程局部变量是在作为静态成员或全局静态的线程变量中声明的,则必须执行
main()
,以便启动线程,此时线程局部静态将在到达其执行点时初始化。@ThomasKejser-请参阅编辑。如果您在静态成员或全局中声明了线程本地静态,那么答案的两部分都适用。非常感谢。我整天都在调试一种情况,这些变量没有初始化。静态初始化确实令人头痛。@ThomasKejser-静态初始化确实令人头痛-同意。除了Stroustrup所说的之外,没有人能保证资源何时可用。