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 变量,因此仅在真正需要时才进行。