线程本地存储及实现原理
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节,也是预备知识的最后一小节。 线程本地存储又叫线程局部存储,其英文为Thread Local Storage,简称TLS ,看似一个很高大上的东西,其实就是线程私有的全局变量而已。 有过多线程编程的读者一定知道,普通的全局变量在多线程中是共享的,一个线程对其进行了修改,所有线程都可以看到这个修改,而线程私有的全局变量与普通全局变量不同,线程私有全局变量是线程的私有财产,每个线程都有自己的一份副本,某个线程对其所做的修改只会修改到自己的副本,并不会修改到其它线程的副本。 下面用例子来说明一下多线程共享全局变量以及线程私有全局变量之间的差异,并对gcc的线程本地存储做一个简单的分析。 首先来看普通的全局变量 #include <stdio.h> #include <pthread.h> int g = 0; // 1,定义全局变量g并赋初值0 void* 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