在 单线程的程序里,有两种基本的数据:全局变量和局部变量。但在多线程程序里,还
有第三种数据类型:线程数据(TSD: Thread-Specific Data)。它和全局变量很象,在线程
内部,各个函数可以象使用全局变量一样调用它,但它对线程外部的其它线程是不可见
的。这种数据的必要性是显而易见 的。例如我们常见的变量 errno,它返回标准的出错信
息。
它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全
局变量,否则在 A 线程里输出的很可能是 B 线程的出错信息。要实现诸如此类的变量,
我们就必须使用线程数据。
我们为每个线程数据创建一个键,它和这个键相关联,在各个
线程 里,都使用这个键来指代线程数据,但在不同的线程里,这个键代表的数据是不同
的,在同一个线程里,它代表同样的数据内容。
下面的多线程程序在 Red Hat9 上的测试通过的线程私有的全局变量使用的例子。
为了简便
起见,省去了所有的错误处理代码。其中的变量 no 是线程私有变量,就相当于线程内部
的全局变量,可以看到,对 no 的访问不 能通过 no 本身变量去访问,而是通过一个全局
变量 key 间接的去访问。
从程序运行时的输出可以发现:线程可以在任何函数中访问 no;
#include<stdio.h>;
pthread_key_t key;
void start();
void work();
int main()
{
pthread_t tid1,tid2;
pthread_key_create( &key, NULL );
pthread_create( &tid1,NULL,(void
有第三种数据类型:线程数据(TSD: Thread-Specific Data)。它和全局变量很象,在线程
内部,各个函数可以象使用全局变量一样调用它,但它对线程外部的其它线程是不可见
的。这种数据的必要性是显而易见 的。例如我们常见的变量 errno,它返回标准的出错信
息。
它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全
局变量,否则在 A 线程里输出的很可能是 B 线程的出错信息。要实现诸如此类的变量,
我们就必须使用线程数据。
我们为每个线程数据创建一个键,它和这个键相关联,在各个
线程 里,都使用这个键来指代线程数据,但在不同的线程里,这个键代表的数据是不同
的,在同一个线程里,它代表同样的数据内容。
下面的多线程程序在 Red Hat9 上的测试通过的线程私有的全局变量使用的例子。
为了简便
起见,省去了所有的错误处理代码。其中的变量 no 是线程私有变量,就相当于线程内部
的全局变量,可以看到,对 no 的访问不 能通过 no 本身变量去访问,而是通过一个全局
变量 key 间接的去访问。
从程序运行时的输出可以发现:线程可以在任何函数中访问 no;
线程拥有各自的 no 存 储空间。
#include<stdio.h>;
pthread_key_t key;
void start();
void work();
int main()
{
pthread_t tid1,tid2;
pthread_key_create( &key, NULL );
pthread_create( &tid1,NULL,(void