当前位置: 首页 > news >正文

C/C++ 线程局部存储(TLS)

在C或C++中,线程局部存储(Thread-Local Storage,简称TLS)是一种用于存储线程特有数据的方法。这意味着每个线程都可以访问它自己的变量实例,而不会影响到其他线程中的同名变量。这在多线程程序中非常有用,因为它可以避免对共享数据的竞争和同步开销。

C++11引入了thread_local关键字来简化线程局部存储的使用。在C中,则需要依赖操作系统或编译器提供的特定机制,如GCC的__thread关键字。

C++11中的thread_local示例

下面是一个C++11中使用thread_local的简单例子:

#include <iostream>
#include <thread>
#include <vector>// 定义一个线程局部的整型变量
thread_local int tls_counter = 0;void increment_counter() {tls_counter++; // 每个线程都会独立地增加自己的tls_counterstd::cout << "Thread " << std::this_thread::get_id() << " incremented tls_counter to " << tls_counter << std::endl;
}int main() {std::vector<std::thread> threads;// 创建10个线程for (int i = 0; i < 10; ++i) {threads.emplace_back(increment_counter);}// 等待所有线程完成for (auto& th : threads) {th.join();}return 0;
}

输出:

Thread 140517560022592 incremented tls_counter to 1
Thread 140517551629888 incremented tls_counter to 1
Thread 140517534844480 incremented tls_counter to 1
Thread 140517543237184 incremented tls_counter to 1
Thread 140517409019456 incremented tls_counter to 1
Thread 140517526451776 incremented tls_counter to 1
Thread 140517518059072 incremented tls_counter to 1
Thread 140517438387776 incremented tls_counter to 1
Thread 140517429995072 incremented tls_counter to 1
Thread 140517421602368 incremented tls_counter to 1

在这个例子中,tls_counter是一个线程局部变量,每个线程都会拥有自己的tls_counter实例。因此,尽管所有线程都调用了increment_counter函数,但每个线程都会独立地增加自己的tls_counter,而不会影响到其他线程的tls_counter

GCC的__thread在C中的示例

对于C语言,可以使用GCC的__thread关键字来实现类似的功能:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>// 定义一个线程局部的整型变量
__thread int tls_counter = 0;void* increment_counter(void* arg) {tls_counter++; // 每个线程都会独立地增加自己的tls_counterprintf("Thread %ld incremented tls_counter to %d\n", (long)pthread_self(), tls_counter);return NULL;
}int main() {pthread_t threads[10];// 创建10个线程for (int i = 0; i < 10; ++i) {pthread_create(&threads[i], NULL, increment_counter, NULL);}// 等待所有线程完成for (int i = 0; i < 10; ++i) {pthread_join(threads[i], NULL);}return 0;
}
Thread 127565616375360 incremented tls_counter to 1
Thread 127565599589952 incremented tls_counter to 1
Thread 127565624768064 incremented tls_counter to 1
Thread 127565582804544 incremented tls_counter to 1
Thread 127565607982656 incremented tls_counter to 1
Thread 127565591197248 incremented tls_counter to 1
Thread 127565574411840 incremented tls_counter to 1
Thread 127565477959232 incremented tls_counter to 1
Thread 127565486351936 incremented tls_counter to 1
Thread 127565494744640 incremented tls_counter to 1

这个例子与C++的例子类似,但使用了C的pthread库来创建和管理线程,并使用__thread关键字来声明线程局部变量。

注意,虽然__thread在GCC中非常有用,但它并不是C语言标准的一部分,因此在使用时需要考虑跨平台兼容性问题。

http://www.lryc.cn/news/429908.html

相关文章:

  • 碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台
  • nginx实验
  • 新技术能够区分真实照片和 AI 伪造图片,但为何平台没有使用?|TodayAI
  • 测量 Redis 服务器的固有延迟
  • 【JVM】JVM内存模型与操作系统内存模型(一)
  • 构建基于LLM的应用程序——为您的应用程序选择合适的LLM
  • raksmart站群服务器多IP配置要求
  • 【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目
  • Linux 多线程
  • C语言编写三子棋游戏:从概念到思路到实现
  • React.js如何使用Bootstrap
  • 深入解析:Redis与Nacos分布式锁在业务中的具体应用
  • MySQL索引的性能优化
  • 协方差详解及在日常生活中的应用实例——天气温度与冰淇淋销量的关系
  • Spring Boot3.3.X整合Mybatis-Plus
  • 快速了解软件测试——测试用例的方法
  • 多线程、多进程,还是异步?-- Python 并发 API 如何选择
  • 汽车服务管理系统 _od8kr
  • 带你玩转小程序推广,实现短链接一键跳转
  • OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程
  • 体育数据API纳米奥运会数据API:高阶数据包接口文档API示例⑦
  • 【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障
  • 数据结构——顺序栈和链式栈
  • PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码
  • three.js实现 加载3dtiles ,瓦片 ,倾斜摄影,功能
  • Qt QTextEdit调用append数据重复的问题
  • 数学基础(二)
  • Java设计模式原则及中介者模式研究
  • logstash入门学习
  • 【代码】Swan-Transformer 代码详解(待完成)