项目需要使用到TLS来实现每个线程独占一定的资源。
通过TLS定义的变量为所在线程独有,其他线程无法访问到,当线程结束后,TLS变量也随之释放。
TLS 分为静态的和动态方式两种,是指 TLS 的访问模型,即编译器如何生成代码来访问 TLS 变量。静态 TLS 模型生成更快的代码,但是不能在进程启动后动态加载的库中引用 TLS 变量(即不能支持某些需要动态加载的库)。动态 TLS 模型可以引用所有的 TLS 变量,但是需要更多的运行时开销。静态 TLS 模型使用固定的偏移量来访问 TLS 变量,而动态 TLS 模型使用间接寻址或重定位来访问 TLS 变量。
这里只介绍静态TLS的使用方法。
Windows下:
__declspec(thread) int tls_i = 1;
Linux下:
旧版:
extern __thread int i;
static __thread struct state s;
__thread char *p;
C11或C++11新版:
thread_local int tls_i = 1;