int main()
{
thread_local int n;
}
上面的代码在C ++ 11中是合法的。
根据cppreference:
thread_local
关键字仅允许用于声明的对象 命名空间范围,在块范围内声明的对象和静态数据 成员。
我只是想知道:
局部变量始终位于当前线程的堆栈中,因此它始终是线程本地的。在这种情况下,thread_local int n;
与int n;
完全相同。
为什么C ++ 11允许将局部变量声明为thread_local
,而不是明确禁用以避免滥用?
答案 0 :(得分:4)
根据标准,块范围内的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
}
答案 1 :(得分:2)
你是正确的,堆栈变量是线程本地的。
thread_local
关键字旨在仅适用于全局或静态范围的变量。通常,这些变量的单个实例是在程序(或dll / so)加载时创建的。 thread_local为每个线程创建这些全局变量的单独实例。
不成为默认值的可能原因是这是C ++ 03中不存在的新行为。此外,根据ABI,可能需要内核调用来访问一个缓慢的thread_local变量,因此只有在真正需要时才会这样做。