块范围内的 thread_local

2024-02-12

有什么用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;
}

Output: 43

在示例中,新线程拥有自己的n但(据我所知)不能用它做任何有趣的事情,那为什么还要麻烦呢?新线程是否属于自己的n有什么用吗?如果没有用,那还有什么意义呢?

自然地,我假设有is一个点。我只是不知道这有什么意义。这就是我问的原因。

如果新线程是自己的n想要(正如我所想的)CPU 在运行时进行特殊处理——也许是因为,在机器代码级别,人们无法访问自己的n以正常方式通过预先计算的新线程堆栈基指针的偏移量——那么我们不仅浪费机器周期和电力而没有任何收获吗?然而,即使不需要特殊处理,仍然没有任何收获!不是我能看到的。

So why thread_local在块范围内,好吗?

参考

  • C 偏好设置thread_local和其他存储类别 https://en.cppreference.com/w/cpp/language/storage_duration
  • 之前的一个问题:在全局范围内声明的 thread_local 变量到底何时被初始化? https://stackoverflow.com/q/35508133/1275653
  • 另一个较早的问题:thread_local变量初始化 https://stackoverflow.com/q/43424789/1275653
  • 还有一个较早的问题:thread_local 的成本 https://stackoverflow.com/q/8489819/1275653

I find thread_local仅在三种情况下有用:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

块范围内的 thread_local 的相关文章

随机推荐

  • Retrofit中如何设置最大网络连接数

    我正在查看一些 AQuery 代码here https stackoverflow com questions 20488302 aquery android query how to load images actually发现有一种方法
  • 通过附加到新环境来检查 .rdata 文件的内容 - 可能吗?

    我感兴趣的是在 RDATA 文件中列出对象并仅加载选定的对象 而不是整个集合 以防某些对象可能很大或可能已存在于环境中 我不太清楚当名称存在冲突时如何做到这一点 因为attach 效果不太好 1 用于检查 R 数据文件的内容而不加载它 这个
  • 如何使用 html2canvas 和 jspdf 以正确且简单的方式导出为 pdf

    我目前正在开发一个学校管理软件 通常需要导出包含以下内容的html内容data tables and div tag 我已经尝试了所有可能的方法来编写一个能够以良好的方式导出我的 html 数据的代码 最好使用 css 在检查了一些问题和答
  • Heroku create-react-app 部署未捕获的语法错误:意外的令牌 <

    每当我使用 create react app buildpack 部署 heroku 应用程序时 第一次尝试访问我的域时 加载的页面是白色的 并且开发人员控制台中出现错误 Uncaught SyntaxError Unexpected to
  • 在Python中解析json字段

    有没有关于在 python 中解析 json 属性的好教程 我希望能够解析 ok 字段的真实值 以及名为 client ind 1 的索引 我不明白 python 文档对这个主题的覆盖范围 如果有人可以解释或向我指出更好的资源 那就太棒了
  • Cordova谷歌地图API密钥足够安全

    我想知道我现在使用的 Google 地图 API 密钥是否安全 因为我有一个带有 Google 地图的 Cordova 应用程序 所以我生成了一个 API 密钥 我无法将我的域密钥列入白名单 因为它在手机上运行客户端 此外 任何解压我的应用
  • 在 WinForms 中使用 XAML

    我想使用 XAML 在完整的 WinForms 应用程序中编译时生成类 尽管我愿意接受建议 但我不想使用 WPF 看起来这应该是可能的 但我找不到任何关于具体如何实现的信息 我发现的最接近的是这个页面 http anoriginidea w
  • 如何在故事板或 xib 中选择背景视图

    如果我用鼠标在情节提要或 xib 中选择一个视图 Xcode 将选择最前面的视图 我知道我可以选择文档大纲中的其他视图 但如果我想抓取背景视图并用鼠标移动它 当我在故事板中单击时 最前面的视图会再次被选中 我认为有一种方法可以循环浏览视图并
  • Visual Studio 2008 支持经典的 ASP 开发吗?

    Visual Studio 2008支持经典的ASP开发吗 我创建经典 ASP 网站已经很多年了 我想知道我是否可以使用我当前的工具集 或者我是否必须放弃使用记事本 Thanks Matt 我知道 VS 2008 现在包含经典 ASP 的智
  • 无法通过 AVPlayer 通过 HTTP 播放 mp3 文件

    我正在尝试通过 AVPlayer 播放 MP3 文件 let url URL string http transom org wp content uploads 2004 03 stereo 40kbps mp3 7 let asset
  • 关于学习“如何思考功能性”的建议?

    作为函数式语言的新手 几周前我开始接触 Erlang 我能接触到的第一种函数式语言 我开始写一些小算法 比如left rotate list bubble sort merge sortETC 我发现自己经常迷失在诸如 我应该使用辅助列表来
  • EJB Glassfish v3.1.2 客户端向会话 bean 传递的数据始终为 null

    我在调用会话 bean 方法从客户端传递方法参数时遇到问题 应用程序中 到达方法调用的数据始终为 null 或设置为默认值 而方法的过程与对象配合得很好 例如 我们有方法来持久化一个对象实体addStudent Student Studen
  • Snakemake 中“未给出通配符错误值”

    我正在尝试使用 Snakemake 制作一个简单的管道 从网络上下载两个文件 然后将它们合并到一个输出中 我认为可行的是以下代码 dwn lnks 1 https molb7621 github io workshop downloads
  • 水平滚动条未显示在我的文本框中

    在 Winform C 应用程序上 我在表单上显示一个文本框 该文本框将显示一行 仅一行 我想展示并使用水平滚动条 我将属性 滚动条 设置为水平 滚动条不显示 我将 WordWrap 添加为 false ScrollBar 不显示 我将 M
  • 我应该忽略 React 警告:输入元素不应从不受控制切换到受控制吗?

    错误代码 警告 组件正在更改要控制的时间类型的不受控输入 输入元素不应从不受控制切换到受控制 反之亦然 在组件的生命周期内决定使用受控或非受控输入元件 描述 所以我有一个组件 可以根据数组中的项目动态呈现多个输入字段 我的数组包含 7 天
  • C++ typedef 类型名 类名::模板

    我无法解析以下代码行的含义 typedef typename Allocator template rebind
  • “Groovy:无法解析类...”(LoginController.groovy 中的导入错误)

    我正在尝试使用 弹簧安全核心 2 0 RC2 使用 Grails 版本 2 3 1 但有我自己的LoginController groovy 按照伯特的笔记 here https stackoverflow com questions 19
  • 用 DOS 显示数字

    我的任务是编写一个程序来显示我的线性地址 程序的PSP 我写了以下内容 ORG 256 mov dx Msg mov ah 09h DOS WriteStringToStandardOutput int 21h mov ax ds mov
  • 为什么这个 bash 提示符表现得很奇怪/消失,我该如何修复它(OS X)?

    我承认我使用了有点冗长的 bash 提示符 username Wed April 01 12 00 00 最近 我有了一个好主意来改变它 以便根据前一个命令的退出值 如果成功 的内部元素将是绿色的 如果失败 它们将是红色的 我让它在大多数情
  • 块范围内的 thread_local

    有什么用thread local块范围内的变量 如果一个可编译的示例有助于说明这个问题 那就是 include