为什么 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 变量,该变量很慢,因此只有在真正需要时才进行。
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 变量,该变量很慢,因此只有在真正需要时才进行。