块范围内thread_local
变量的用途是什么?
如果可编译的示例有助于说明问题,则为:
#include <thread>
#include <iostream>
namespace My {
void f(int *const p) {++*p;}
}
int main()
{
thread_local int n {42};
std::thread t(My::f, &n);
t.join();
std::cout << n << "\n";
return 0;
}
输出:
43
在示例中,新线程获得了自己的
n
,但是(据我所知)对此没有任何兴趣,所以为什么要打扰呢?新线程自己的n
有什么用吗?如果没有用,那又有什么意义呢?当然,我认为这是有道理的。我只是不知道这是什么意思。这就是为什么我问。
如果新线程自己的
n
(在我看来)要在运行时由CPU进行特殊处理-可能是因为,在机器代码级别上,无法以通常的方式通过从线程的基指针的预先计算出的偏移量来访问自己的n
。新线程的堆栈—那么,我们不仅浪费机器周期和电力就是没有 yield 吗?但是,即使不需要特殊处理,也没有收获!我看不到。那么,为什么要在块范围内使用
thread_local
?引用
thread_local
and other storage classes上的首选项最佳答案
我发现thread_local
仅在以下三种情况下有用:
thread_local
对象的析构函数。对于每个使用thread_local
声明进入代码块的线程,该thread_local
对象的析构函数都被调用一次(在线程生命周期的结尾)。 关于c++ - 块范围内的thread_local,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55191177/