线程本地存储又叫线程局部存储,英文名称为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赋值为100pthread_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)实现的私有的全局变量。
下例代码与上述例子大体相似,差别就

最低0.47元/天 解锁文章
882

被折叠的 条评论
为什么被折叠?



