int main()
{
thread_local int n;
}
在C++11中,上述代码是合法的。
根据cppreference的说法:
thread_local
关键字只允许用于在命名空间作用域内声明的对象、块作用域内声明的对象和静态数据成员。
我只是想知道:
局部变量总是在当前线程的堆栈上,因此始终是线程本地的。在这种情况下,thread_local int n;
与int n;
完全相同。
C++11为什么允许将局部变量声明为thread_local
,而不是明确禁用它以避免滥用呢?
thread_local
为其定义了一个新的存储期,就像static
一样。 - chrisvoid foo() { static int s; }
- 假设foo
被调用以创建s
,那么s
不会在程序结束之前被销毁。它不会被放置在函数的栈帧中 - 这样会过早地销毁它。thread_local
是一种替代static
或隐式自动存储期的存储期方式。仅仅因为它是隐式的,并不意味着它总是那个 - 你可以明确并改变它,例如改为线程局部。我使用static
是因为它更容易理解。你可以大部分上把thread_local
看作类似的,只不过是每个线程而不是全局的。 - chris