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

Why does C++11 allow you to declare a local variable as thread_local?

int main()
{
    thread_local int n;
}

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

根据cppreference

The thread_local keyword is only allowed for objects declared at namespace scope, objects declared at block scope, and static data members.

我只是想知道:

局部变量总是在当前线程的栈上,所以它总是线程局部的。在这种情况下,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 变量,该变量很慢,因此只有在真正需要时才进行。