Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1665749
  • 博文数量: 607
  • 博客积分: 10031
  • 博客等级: 上将
  • 技术积分: 6633
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-30 17:41
文章分类

全部博文(607)

文章存档

2011年(2)

2010年(15)

2009年(58)

2008年(172)

2007年(211)

2006年(149)

我的朋友

分类: LINUX

2008-08-08 20:04:46

有时候,线程唯一的数据很有用。

TSD提供了这种需要一套函数调用的全局数据。本质上,这通过创建依附于特定线程的“key-value”数组来实现。

key 是pthread_key_t类型(整数类型)的变量,一旦key被创建,你就可以通过pthread_getspecific()/pthread_setspecific()来访问key关联的数据。
value是void*类型(32位和64位),当你想放任何比void*大的数据结构时,就要用malloc()为该数据结构分配好内存并放个指向该数据结构的指针在void* cell里。

TSD的标准用法是:
全局声明所有的key,在main()里初始化他们,然后创建线程,启动程序。
如果你在一个库里创建某种TSD,那你就必须在使用之前安排好初始化工作。

Usage of POSIX TSD

pthread_key_t house_key;

foo((void *) arg)
{
    pthread_setspecific(house_key, arg);
    bar();
}
bar()
{
    float n;
    n = (float) pthread_getspecific(house_key);
}

main()
{...
    pthread_keycreate(&house_key, destroyer);
    pthread_create(&tid, NULL, foo, (void *) 1.414);
    pthread_create(&tid, NULL, foo, (void *) 3.1415926);
...}

第一个线程将看到root(2),第2个线程将看到pi。

POSIX允许你清除1个TSD,通过pthread_key_delete().但这似乎是个坏主意!
调用pthread_getspecific()需要注意的是如果key还未被设置,返回的将是NULL。

TLS(Thread Local Storage)是一种实现TSD的方法,局限是不能动态分配,需要编译器支持,要么特别的内存影射技巧。

TSD key 是全局共享的变量。但由于从不被改变,所以不需要加锁。可以把它看成常量。














阅读(751) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~