gpt4 book ai didi

c++ - block 范围内的 thread_local

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:35 24 4
gpt4 key购买 nike

thread_local 变量在 block 范围内有什么用?

如果一个可编译的样本有助于说明问题,这里是:

#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 以正常方式通过预先计算的新线程堆栈基指针的偏移量——那么我们不仅仅是在浪费机器周期和电力而没有任何收获吗?然而,即使不需要特殊处理,仍然没有收获!不是我能看到的。

那么为什么 thread_local 在 block 范围内呢?

引用资料

最佳答案

我发现 thread_local 仅在三种情况下有用:

  1. 如果您需要每个线程都有一个唯一的资源,这样它们就不必共享、互斥等来使用所述资源。即便如此,这仅在资源很大和/或创建成本高昂或需要跨函数调用持久存在时才有用(即,函数内的局部变量是不够的)。

  2. (1) 的分支 - 当调用线程最终终止时,您可能需要特殊的逻辑来运行。为此,您可以使用函数中创建的 thread_local 对象的析构函数。对于使用 thread_local 声明进入代码块的每个线程,此类 thread_local 对象的析构函数将被调用一次(在线程生命周期结束时)。

  3. 您可能需要为调用它的每个唯一线程执行一些其他逻辑,但只需执行一次。例如,您可以编写一个函数来注册调用函数的每个唯一线程。这听起来可能很奇怪,但我发现它可以用于管理我正在开发的库中的垃圾收集资源。此用法与 (1) 密切相关,但在构建后未被使用。在线程的整个生命周期内实际上是一个哨兵对象。

关于c++ - block 范围内的 thread_local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55191177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com