码迷,mamicode.com
首页 > 其他好文 > 详细

Thread-local storage (TLS)

时间:2014-11-10 17:21:01      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   strong   

线程存储原理:为变量在每一个现存的线程里分配一个实例,需要处理器支持,并不是所有都支持!支持全局的,静态的变量,但不支持局部变量。

 

关键字

   __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:1
work2:2 
work2:0, name=
--->work2:1
exit, 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)

标签:style   blog   http   io   color   ar   os   sp   strong   

原文地址:http://www.cnblogs.com/iclk/p/4087342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!