【发布时间】:2014-10-04 17:14:19
【问题描述】:
我正在编写一个程序,它使用静态方法和属性在 main 之前完成一些事情。语言是 C++11
我的问题是,我什么时候可以保证线程局部变量(带有 pthread)会存在? IE。在 main 开始之前,我可以在主线程的静态初始化中安全地设置线程局部变量吗?
【问题讨论】:
标签: c++ thread-safety pthreads
我正在编写一个程序,它使用静态方法和属性在 main 之前完成一些事情。语言是 C++11
我的问题是,我什么时候可以保证线程局部变量(带有 pthread)会存在? IE。在 main 开始之前,我可以在主线程的静态初始化中安全地设置线程局部变量吗?
【问题讨论】:
标签: c++ thread-safety pthreads
我可以在 main 开始之前在主线程的静态初始化中安全地设置线程局部变量吗?
C++ 编程语言,第四版,Bjarne Stroustrup:
12.1.8。局部变量
在函数中定义的名称通常称为本地名称。 执行线程时初始化局部变量或常量 达到它的定义。除非声明为静态,否则每次调用 函数有自己的变量副本。如果一个局部变量是 声明为静态的,单个静态分配的对象(第 6.4.2 节)将 用于在函数的所有调用中表示该变量。 它 只会在执行线程第一次到达时初始化 它的定义。例如:...
15.4.1。非局部变量的初始化 ....
非本地(静态分配)变量的初始化是 由实现用于启动的任何机制控制 C++ 程序。 只有在以下情况下才能保证此机制正常工作 main() 被执行。
虽然你指的是线程局部变量,因为你的初始化代码本身显然是全局的static,所以你不能保证你的初始化代码在main()开始运行之前已经执行,所以如果你有静态依赖于其他静态,你可能会遇到问题。
但是一旦main() 执行,你所有的static 代码都被初始化了。如果是这样,您在main() 中引用的静态资源保证可用。
如果您的线程局部变量是在静态成员或全局静态变量的线程变量中声明的,则必须执行main() 以便初始化静态线程,并且取决于您声明线程局部变量的方式,此时也会启动线程局部静态将在到达执行点时初始化。
【讨论】:
main() 以便启动线程,此时线程局部静态变量将在到达其执行点时被初始化。