【问题标题】:Local static variable and multithreading — is it safe?局部静态变量和多线程——安全吗?
【发布时间】:2014-04-30 14:19:14
【问题描述】:

如果我有

pthread_create(newThread, &attr, threadFunc, arg)

它被多次调用以创建运行threadFunc 的线程,而threadFunc 类似于:

void threadFunc(){      static int x = 0;      }

这个x 变量是否在所有线程之间共享?我知道它不在线程的堆栈中,因为它是静态的,并且它位于全局变量所在的位置。 如果没有,并且每个线程都有自己的x,那么就不需要锁了——对吗?

【问题讨论】:

  • 如果你想让它成为线程安全的,使用线程本地存储。

标签: c linux multithreading static


【解决方案1】:

不,它不是线程安全的,x 在所有线程之间共享的。此外,不能保证 C 中对 int 的操作是原子的。

【讨论】:

    【解决方案2】:

    静态x 由使用threadFunc 作为其启动例程的所有线程共享。如果您希望每个线程都有该x 的副本,您应该使用thread-specific data

    【讨论】:

    • 常规局部变量是线程安全的,所以是的,如果你可以让它作为一个局部变量工作,你应该使用一个局部变量。但是问题就变成了——为什么之前是静态的?如果可以,请始终使用常规局部变量,而不是静态变量。
    • @JonathanLeffler:我们能否证明局部变量是线程安全的?假设我们有一个具有局部变量的方法,并且该方法永远不会返回并包含一个无限循环,该循环读取和写入该变量。在此之前,该局部变量的地址存储在全局中,第二个线程通过全局别名访问局部变量。现在是线程安全的吗?
    • 局部变量是线程安全的(特定于线程),但是提供局部变量的全局指针使其不安全;它明确地共享其他线程本地的内容,然后需要协调以安全地访问变量。只读访问不是问题,但任何读写混合都是潜在的(如果不是实际的)问题。
    • @JonathanLeffler:所以你的意思是,如果以线程安全的方式使用本地是线程安全的,如果不以线程安全的方式使用它就不是线程安全的。对任何事物来说,这种说法难道不是真的吗,而不仅仅是当地人?
    • @EricLippert:有些东西是线程不安全的,不管它是如何使用的。例如,返回指向静态数据的指针不是线程安全的。如果另一个线程调用相同的函数,那么您的线程所看到的就悬而未决。使用自动局部变量,您必须努力使它们成为线程不安全的。您必须显式发送它们以使它们可供另一个线程访问,并且您必须担心第一个线程何时使指向其局部变量的全局指针无效(通过退出函数)。但是,默认情况下,局部变量是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多