【发布时间】:2014-05-12 17:29:16
【问题描述】:
这两个代码段有区别吗:
void f() {
thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
和
void f() {
static thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
背景故事:最初我有一个 STATIC 向量 V(用于保存一些中间值,每次进入函数时它都会被清除)和一个单线程程序。我想把程序变成一个多线程的程序,所以我必须以某种方式摆脱这个静态修饰符。我的想法是把每一个静态都变成thread_local,而不用担心别的?这种方法会适得其反吗?
【问题讨论】:
-
拥有
thread_local局部变量毫无意义……每个线程都有自己的调用堆栈。 -
最初编写了几个 C 函数来返回静态或全局变量的地址。后来发现这在多线程应用程序(例如 errno、localtime)中使用时会导致模糊的错误。此外,当从多个线程调用函数或必须在许多调用对象和方法之间传递线程上下文对象时,使用互斥锁保护共享变量有时是非常有害的。线程本地变量解决这些和其他问题。
-
@Konrad Rudolph 仅将局部变量声明为
static而不是static thread_local不会为每个线程初始化一个变量实例。 -
@davide 这不是重点,无论是我还是 OP。我们不是在谈论
static与static thread_local,而是在谈论auto与thread_local,使用auto的前C++11 含义(即自动存储)。 -
另见How to define thread-local local static variables?。快速语言律师说明... Microsoft 和 TLS 支持在 Vista 前后发生了变化;见Thread Local Storage (TLS)。该更改会影响 Singleton 之类的内容,可能适用也可能不适用。如果您使用的是 abondware 软件模型,那么您可能会没事的。如果您乐于支持多种编译器和平台,那么您可能需要注意它。
标签: c++ c++11 thread-local-storage