为什么 C++11 允许您将局部变量声明为 thread_local


int main()
{
    thread_local int n;
}

上面的代码在 C++11 中是合法的。

根据 cpp 偏好:

thread_local 关键字只允许用于声明在 命名空间范围、在块作用域声明的对象和静态数据 成员。

我只是想知道:

局部变量始终

位于当前线程的堆栈上,因此它始终是线程本地变量。 在这种情况下,thread_local int n;int n;完全相同。

为什么 C++11 允许将局部变量声明为 thread_local ,而不是显式禁用它以避免滥用?

根据标准,块范围内的thread_local变量也被隐式static。 但是,并非所有static变量都是thread_local

所以

 int main()
 {
       thread_local int x;
 }

实际上相当于

 int main()
 {
       thread_local static int x;
 }

但与;

 int main()
 {
       int x;    //  auto implied
 }

您是正确的,因为堆栈变量是线程本地的。

thread_local键仅适用于全局或静态范围的变量。通常,这些变量的单个实例是在程序(或dll/so(加载时创建的。thread_local为每个线程创建这些全局变量的单独实例。

不是默认值的可能原因是这是 C++03 中不存在的新行为。此外,根据 ABI 的不同,可能需要内核调用来访问速度较慢的 thread_local 变量,因此仅在真正需要时才进行。

最新更新