int main()
{
thread_local int n;
}
上面的代码在C++ 11中是合法的。为什么C++ 11允许你声明一个局部变量为thread_local?
根据cppreference:
的
thread_local
关键字仅允许在 命名空间范围中,在框范围,以及静态数据成员 声明对象声明的对象。
我只是想知道:
局部变量始终是当前线程的堆栈,所以它总是线程本地。在这种情况下,thread_local int n;
与int n;
完全相同。
为什么C++ 11允许声明局部变量thread_local
,而不是明确禁用它,以避免滥用?
本地并不意味着自动存储时间。实际上,thread_local定义了一个新的存储持续时间,就像'static'一样。 – chris
“本地化并不意味着自动存储时间。”,任何示例? – xmllmx
'void foo(){static int s; }'''s'不会被销毁,直到程序结束时,假设调用了'foo'以便创建's'。它不会放在函数的堆栈框架上 - 那会太早摧毁它。 'thread_local'是'static'或者**隐式**自动持续时间的替代存储持续时间。仅仅因为它是隐式的并不意味着它总是那个 - 你可以明确地将其改变,例如,改为线程本地。我正在使用'static',因为它可能更加熟悉。你可以通过相同的方式来思考'thread_local',但是每个线程都可以代替全局。 – chris