最后看一下什么是线程本地存储(TLS)

​线程本地存储又叫线程局部存储,英文名称为Thread Local Storage,简称TLS,实质上是线程私有的全局变量而已。

普通全局变量在多线程中是共享的,一个线程对其进行了修改,其它所有线程都可以看到,而线程私有的全局变量与普通全局变量不同,线程私有的全局变量是线程的私有财产,每个线程都有自己的一个副本,某个线程对其做出的修改只会修改到自己的副本,并不会修改到其它线程的副本。

来看个普通的全部变量的例子:

#include <stdio.h>#include <pthread.h>int g = 0;  // 1,定义全局变量g并赋初值0void *start(void *arg){
  
    printf("start, g[%p] : %d\n", &g, g); // 4,子线程中打印全局变量g的地址和值  g++; // 5,修改全局变量  return NULL;}int main(int argc, char *argv[]){
  
    pthread_t tid;  g = 100;  // 2,主线程给全局变量g赋值为100  pthread_create(&tid, NULL, start, NULL); // 3, 创建子线程执行start()函数  pthread_join(tid, NULL); // 6,等待子线程运行结束  printf("main, g[%p] : %d\n", &g, g); // 7,打印全局变量g的地址和值  return 0;}

上述程序注释1的地方定义了一个普通全局变量g并设置其初始值为0,程序运行后主线程首先将g修改为100(注释2),然后创建了一个子线程来执行start函数(注释3),start先打印出g的值(注释4)来确认在子线程中可以看到主线程对g的修改,之后修改g的值(注释5),然后start结束运行,主线程在注释6处等待start运行完毕后,在注释7处打印g的值来确认start对g的修改可以影响到主线程对g的读取。

编译并运行上述程序:

$ gcc thread.c -o thread -lpthread$ ./threadstart, g[0x601064] : 100main, g[0x601064] : 101

可以看到,g在两个线程中的内存地址都是一样的,任何一个线程都可以读取到另外一个线程对g的修改,实现了全局变量在多线程中的共享。

之后再来看线程本地存储(TLS)实现的私有的全局变量。

下例代码与上述例子大体相似,差别就

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值