c++ - block 范围内的 thread_local

标签 c++ multithreading thread-local-storage

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/

相关文章:

java - 为什么我们使用 if,else if 而不是多个 if block 如果主体是返回语句

java - Batik:当我从线程调用 invokeLater 时出现 IllegalStateException

linux - ELF 文件 TLS 和 LOAD 程序部分

java - CompleteableFutures 的 runAsync

c++ - TLS 变量上的 "illegal thread-local reference to regular symbol"错误

c++ - 为什么在使用 MinGW 添加 ltalloc 时会出现段错误

c++ - 在 *nix 上了解异步编程的基础知识

c++ - yaml-cpp 0.5.1 的可选 key

c++ - 需要帮助将两个 STL 映射合并为一个(map<char,string> 和 map<string,int> 到 map<char,map<string,int>>)

c# - 跨多个线程的 Linq-to-SQL DataContext