首页 > 代码库 > Thread-local storage (TLS)
Thread-local storage (TLS)
线程存储原理:为变量在每一个现存的线程里分配一个实例,需要处理器支持,并不是所有都支持!支持全局的,静态的变量,但不支持局部变量。
关键字
__thread
__thread int i;
extern __thread struct state s;
static __thread char *p;
测试
#include<pthread.h>#include<unistd.h>#include<string.h>#include <stdio.h>__thread int var=1;typedef struct context_t{ int p1; char name[256];}context;__thread context ctx;void product(char *name){ static __thread int i = 0; printf("--->%s:%d\n",name, ++i);}void* worker1(void*arg);void* worker2(void*arg);int main(){ pthread_t pid1,pid2; memset(&ctx, 0, sizeof(context)); ctx.p1 = 11; strcpy(ctx.name, "null"); pthread_create(&pid1,NULL,worker1,NULL); pthread_create(&pid2,NULL,worker2,NULL); pthread_join(pid1,NULL); pthread_join(pid2,NULL); printf("exit, var:%d, p1:%d, name=%s \n",var,ctx.p1, ctx.name); return 0;}void* worker1(void* arg)
{strcpy(ctx.name, "lilei");ctx.p1=1;printf("work1:%d \n", ++var);printf("work1:%d, name=%s\n", ctx.p1, ctx.name);product("work1");}void* worker2(void* arg)
{sleep(5);printf("work2:%d \n", ++var);printf("work2:%d, name=%s\n", ctx.p1, ctx.name);product("work2");}
输出结果:
[root@localhost test]# gcc -lpthread -o test test.c [root@localhost test]# ./test work1:2 work1:1, name=lilei--->work1:1work2:2 work2:0, name=--->work2:1exit, var:1, p1:11, name=null
可以看出多个线程调用,但是var,ctx, i变量值显示都是线程独立的。
参考 http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Thread_002dLocal.html
另一种 TLS 通过pthread_key_create实现 http://www.cnblogs.com/gogly/articles/2416362.html
Thread-local storage (TLS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。