thread_local

article/2025/10/24 21:38:14

一、介绍

thread_local这个关键字的是C++11之后的产物,主要适用的场景是:本线程这个生命周期里面修改和读取,不会与别的线程相互影响。

在C++中全局变量和static变量一般都是针对与整个进程里面共享的,一旦声明之后,所有的线程都会共享这个变量,就算每个线程希望对这个变量进行单独操作,也必须通过加锁来保证安全性。

引入了thread_local之后,就将这一种单个线程生命周期内使用的场景隔离开来了,这种变量本来就不需要与其他线程共享这部分数据,所以也不需要加锁。

00bc378431a0200fbf6efe31b8f954af.png

二、例子

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
// 只需要声明一次,多个线程会自己分配一份自己Thread去玩,线程之间对这个数据的操作不会相互影响。 
thread_local unsigned int rage = 1; 
void increase_rage(const std::string& thread_name)
{++rage; std::cout << "Thread Name:" << thread_name << ": " << "&rage:"<<&rage <<" rage:"<<rage<< '\n';
}int main()
{std::cout << "Thread Name:main: " << "&rage:"<<&rage <<" rage:"<< rage << '\n';std::thread a(increase_rage, "a"), b(increase_rage, "b");a.join();b.join();
}

output:

Thread Name:main: &rage:0x7f8ef184473c rage:1 
Thread Name:a: &rage:0x7f8ef04f26fc rage:2
Thread Name:b: &rage:0x7f8eefcf16fc rage:2

输出分析:


从上面的输出能看出来,变量rage被声明为一次,但是不同的Thread在使用它的时候,都是Thread开始的时候重新对rage进行赋值为初始值1,不过它们的地址却不相同,也就是说不同的线程对于这一个变量都做了一次copy操作。

参考文档:

https://en.cppreference.com/w/cpp/language/storage_duration#Storage_duration


http://chatgpt.dhexx.cn/article/hqFg9HBs.shtml

相关文章

localStorage是什么???

一、什么是localStorage、sessionStorage 在HTML5中&#xff0c;新加入了一个localStorage特性&#xff0c;这个特性主要是用来作为本地存储来使用的&#xff0c;解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k)&#xff0c;localStorage中一般浏览器支持的…

什么是localStorage?

一、什么是localStorage、sessionStorage 在HTML5中&#xff0c;新加入了一个localStorage特性&#xff0c;这个特性主要是用来作为本地存储来使用的&#xff0c;解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k)&#xff0c;localStorage中一般浏览器支持的…

Locale 及Locale.getDefault()

1.什么是Locale&#xff1f; Locale对象表示了一个特定的地理&#xff0c;政治或文化区域。需要使用到Locale执行其任务的操作称为区域设置敏感&#xff0c;并使用Locale为用户定制信息。 例如显示一个数字就是一个区域设置敏感的操作–该数字应根据用户所在国家&#xff0c;…

LocalStorage

目录 1.什么是Web存储&#xff1f; 2.localStorage、sessionStorage、Cookie和Session 3.Storage接口 4.localStorage基本操作 5.storage事件 参考书籍&#xff1a;《JavaScript 权威指南----ECMAScript5HTML5DOMHTML5BOM》编著&#xff1a;张亚飞 1.什么是Web存储&…

在net core npoi导入excel 所遇到的问题PublicKeyToken=0df73ec7942b34e1

在vs中测试一切正常 发布到iis&#xff0c;是使用的是***独立发布&#xff0c;x64***&#xff0c;部署好之后&#xff0c;执行nopi导入读取数据功能&#xff0c;提示 PublicKeyToken0df73ec7942b34e1&#xff0c;找不到系统文件 尝试过修改nopi的版本&#xff0c;由2.51.变成…

.net 查看程序集(*.dll)的PublicKeyToken

1.运行>powershell ([system.reflection.assembly]::loadfile("C:\Users\wangbinbin\Desktop\bin\log4net.dll")).FullName 2.使用vs的Tools Command Prompt命令行工具&#xff0c;输入SN -T "path"&#xff0c;就会显示这个dll 的PublicKeyToken SN -…

查看PublicKeyToken和生成PublicKeyToken

http://hi.baidu.com/honfei/item/7777500b20d8ff8a02ce1bd2

未能加载文件或程序集“Newtonsoft.Json,Version = 13.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed“..

未能加载文件或程序集"Newtonsoft.Json,Version 13.0.0.0,Culture neutral,PublicKeyToken 30ad4fe6b2a6aeed"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配.&#xff08;异常来自HRESULT&#xff1a;0x80131040&#xff09; 今天把生成的exe文件&a…

WinForm转Console Message=未能从程序集“, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“没有 RVA

1.异常截图 2.源代码及运行结果 3.相关异常及解决办法 1.异常截图 异常具体信息如下&#xff1a; 未处理System.TypeLoadException HResult-2146233054 Message未能从程序集“LockTestV2, Version1.0.0.0, Cultureneutral, PublicKeyTokennull”中加载类型“LockTestV2…

能加载文件或程序集“System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖

能加载文件或程序集“System.Web.Mvc, Version3.0.0.0, Cultureneutral, PublicKeyToken31bf3856ad364e35”或它的某一个依赖项。 解决方法&#xff1a; 安装ASP.NET MVC 3 MVC3下载地址&#xff1a; https://www.microsoft.com/en-us/download/details.aspx?id1491 下载之…

IIS 发布Web网站或接口,提示错误“未能加载文件或程序集“XXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”

IIS 发布Web网站或接口&#xff0c;提示错误“未能加载文件或程序集“XXXX, Version1.0.0.0, Cultureneutral, PublicKeyTokennull” 一、产生错误的原因二、解决办法1、修改IIS应用程序池的兼容性2、修改Visual Sstudio 平台属性 一、产生错误的原因 原因分析&#xff1a;Vis…

CS0012 错误。必须添加对程序集”xxxxx,Version=4.0.0.0,Culture=neutral,PublicKeyToken=xxxxxxx“的引用

今天复习c#二次开发Autocad中增添选项卡的时候突然出现的错误&#xff0c;一直提醒缺少引用&#xff0c;可是正常的引用都添加进来了&#xff0c;所以我就找到了之前的程序&#xff0c;发现缺少的是PresentationCore.dll文件&#xff0c;在这里记录一下&#xff0c;防止以后在遇…

VS错误:未能加载文件或程序集“NPOI, Version=2.3.0.0, Culture=neutral, PublicKeyToken...

未能加载文件或程序集"NPOI, Version2.3.0.0, Cultureneutral, PublicKeyTokenb03f5…它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配 参考https://blog.csdn.net/xingyu0806/article/details/50450420 一、查看NPOI版本是否和错误提示版本匹配,不匹配的话&am…

NET 5连mysql数据库遇到的问题-1252;PublicKeyToken=cc7b13ffcd2ddd51

NET 5连mysql数据库遇到的问题 1. System.NotSupportedException:“No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.” 解决办法&#xff1a; nuget添加 代码中加…

(8)C#导入库编译出错:请考虑使用 app.config 将程序集“log4net, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”

当引用SuperSocket类库时,导致编译出下面的提示: 请考虑使用 app.config 将程序集“log4net, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”从版本“1.2.13.0”[]重新映射到版本“2.0.12.0” 这时修改如果运行程序,可以打开,但是执行一定位置,就会出错。 这时候怎…

asp.net 查看dll的PublicKeyToken值方法

在做asp.net开发过程中&#xff0c;偶尔对有些dll&#xff0c;进行强制签名&#xff0c;那么在注册dll到gac的时候&#xff0c;就需要知道dll的PublicKeyToken值&#xff0c;如何通过简单的方法&#xff0c;来获得这个值呢&#xff0c;下面是一个很好又实用的方法&#xff1a; …

Could not load file or assembly ‘WMS.API.Service, Culture=neutral, PublicKeyToken=null‘. 系统找不到指定的文件

此报错是由于在Bin目录下没有此类库的DLL 解决办法 添加对应的项目引用&#xff0c;重新生成就可以解决