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

时间:2017-02-09 07:02:54

标签: c++ multithreading c++11 standards

int main()
{
    thread_local int n;
}

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

根据cppreference

  

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

我只是想知道:

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

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

2 个答案:

答案 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变量,因此只有在真正需要时才会这样做。