【问题标题】:Using __thread in c++0x在 c++0x 中使用 __thread
【发布时间】:2011-10-26 05:01:00
【问题描述】:

我读到 C++ 中有一个新关键字:它是我读到的 __thread

我只知道它是一个可以像static 关键字一样使用的关键字,但我什么都不知道。这个关键字是否仅仅意味着,例如,如果一个变量是这样声明的:

__thread int foo;

那么与该变量有关的任何事情都将使用新线程执行?

【问题讨论】:

  • 你在哪里读到的?

标签: c++ multithreading c++11


【解决方案1】:

这是thread_local,而不是__thread。用于定义具有线程存储时长的变量。

thread_local 是在 C++0x 中添加的 存储持续时间说明符。还有其他存储时长:staticautomaticdynamic

来自this link

线程本地存储持续时间(C++11 特性)。变量在线程开始时分配,在线程结束时释放。每个线程都有自己的变量实例。只有声明为 thread_local 的变量才有此存储期限。


我认为这个关键字的引入是通过在 C++0x 中引入标准化的内存模型来实现的:

【讨论】:

  • 哇,答案看起来与 3 分钟前完全不同。
  • thread_local是C++03中新增的存储时长说明符”:这是什么废话?!
  • @Tomalak:你知道这不是“废话”而是“错字”,不是吗?
  • 不幸的是,Apple 仍然不希望你使用它:stackoverflow.com/questions/28094794/…
  • __thread 在 GNU、clang 等平台上受支持。它在 thread_local 之前可用...它们不是等效的,两者都受支持。不同之处在于 thread_local 使用延迟初始化来仅在访问它的线程中初始化变量。 __thread 根本不初始化,您必须为每个线程手动初始化它。因此,thread_local 每次访问都会产生开销,而 __thread 则不会。由于这种低效率,Apple 的编译器禁用了 thread_local 而不是 thread,虽然 __thread 并非在所有编译器上都可用,但 __thread 可用于 GNU 工具。
【解决方案2】:

来自the Wikipedia article on "Thread-local storage"

线程本地存储 (TLS) 是一种计算机编程方法,它使用 线程本地的静态或全局内存。

这有时是需要的,因为通常一个进程中的所有线程 共享相同的地址空间,这有时是不可取的。

还有:

C++0x 引入了thread_local 关键字。除此之外,各种 C++ 编译器实现提供了声明线程本地的特定方法 变量:

Sun Studio C/C++、IBM XL C/C++、GNU C 和 Intel C/C++(Linux 系统)使用以下语法:

    __thread int number;

Visual C++、Intel C/C++(Windows 系统)、Borland C++ Builder 和 Digital Mars C++ 使用以下语法:

    __declspec(thread) int number;

Borland C++ Builder 也支持语法:

    int __thread number;

因此,虽然__thread 确实在实践中和某些系统上存在,但thread_local 是新的、官方的、C++0x 关键字,具有相同的功能。

只要您可以访问 C++0x,请优先使用非标准 __thread

【讨论】:

    【解决方案3】:

    不,它确实 not 意味着“与该变量有关的任何事情都将使用新线程执行”。这意味着每个存在的线程都会有一个变量的副本,每个线程只能看到自己的变量副本。

    【讨论】:

      【解决方案4】:

      关键字称为thread_local。这意味着每个线程都有自己的变量版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多