C++11 thread_local关键字
2023-04-18 14:34:40 时间
这是一篇科普文--关于thread_local关键字
首先,C++11之前并没有对并发进行任何的支持,C++11首次提供了以下的支持:
- 语言核心定义了一个内存模型,保证当更改"被两个不同线程使用"的两个object时,他们彼此独立,而引用thread_local关键字
- 标准库支持启动多线程,包括传递参数、返回数值、跨线程边界传递异常、同步化等,使得控制流程和数据访问同步成为可能。
本节仅对thread_local进行学习
------不华丽的分割线------
抛个砖
如果一个线程挂起或两个线程试图同时访问同一项数据,结果将如何?
引个玉
为了解决并行性问题,C++定义了一个支持线程化执行的内存模型,添加了关键字thread_local,提供了相关的库支持。
关键字thread_local将变量声明为静态存储,其持续性与特定线程相关:即定义这种变量的线程过期时,变量也将过期。
使用举例:
例子来源C++11&14 Thread_local
C++11中就提出了thread_local
这个变量修饰,用于解决线程没有自己全局变量的问题。
#include <iostream>
#include <thread>
thread_local int i = 0;
int func(int val)
{
i = val;
i = i + 2;
std::cout<<i;
}
int func2()
{
std::cout<<i;
}
int main()
{
i = 9;
std::thread t1(func, 1);
std::thread t2(func, 2);
std::thread t3(func, 3);
std::thread t4(func2);
t1.join();
t2.join();
t3.join();
t4.join();
std::cout<<i<<std::endl;
return 0;
}
运行结果:
使用thread_local
修饰符在全局声明了一个i
变量,i
变量将被每个新建线程拷贝作为其域内的全局变量
线程1中的i
变量和main中的i
变量指向不同的地址
thread_local
修饰后仍然是一个变量,依旧能够使用取地址操作或通过引用的方法传递给其他线程
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击