【问题标题】:When do pthread thread variables begin existing during static initialisation?在静态初始化期间 pthread 线程变量何时开始存在?
【发布时间】:2014-10-04 17:14:19
【问题描述】:

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

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

【问题讨论】:

    标签: c++ thread-safety pthreads


    【解决方案1】:

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

    C++ 编程语言,第四版,Bjarne Stroustrup:

    12.1.8。局部变量

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

    15.4.1。非局部变量的初始化 ....

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

    虽然你指的是线程局部变量,因为你的初始化代码本身显然是全局的static,所以你不能保证你的初始化代码在main()开始运行之前已经执行,所以如果你有静态依赖于其他静态,你可能会遇到问题。

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

    如果您的线程局部变量是在静态成员或全局静态变量的线程变量中声明的,则必须执行main() 以便初始化静态线程,并且取决于您声明线程局部变量的方式,此时也会启动线程局部静态将在到达执行点时初始化。

    【讨论】:

    • 我担心的变量是线程本地变量。它们在什么时候被保证存在?
    • 这是答案的第 1 部分:仅在执行线程第一次达到其定义时才会初始化。因此,如果您的线程局部变量是在作为静态成员或全局静态变量的线程变量中声明的,则必须执行 main() 以便启动线程,此时线程局部静态变量将在到达其执行点时被初始化。
    • @ThomasKejser - 见编辑。如果您在静态成员或全局变量中声明了线程局部静态,则答案的两个部分都适用。
    • 非常感谢。我整天都在调试这些变量未初始化的情况。静态初始化真的很头疼。
    • @ThomasKejser - 静态初始化真的很头疼 - 同意。除了 Stroustrup 所说的之外,无法保证资源何时可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2010-12-22
    • 2017-05-13
    相关资源
    最近更新 更多