浅谈并发服务器---多线程并发---4(线程安全)

浅谈并发服务器---多线程并发---4(线程安全)_第1张图片


           在多线程环境下,进程内的所有的线程共享进程 的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部 有效。在上一篇文章中提到savadate()函数是一个非线程安全函数,是因为使用了静态变量,在多线程环境里,应避免使用静态变量。在linux系统中提供了线程特定数据(TSD)来取代静态变量。它类似于全局变量,但是是各个线程私有的,它以线程为界限。TSD是定义线程私有数据的唯一方法。同一进程中的所有线程,它们的同一特定数据项都由一个进程内唯一的关键字key来标志。用这个关键字,线程可以存取线程私有数据。

            在线程特定数据中通常使用4个函数.

1) #include

   int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));

pthread_key_create()函数在进程内部分配一个标志TSD的关键字,参数key指向创建的关键字,该关键字对一个进程中的所有线程是惟一的。所以在创建key时,每个进程只能调用一次创建pthread_key_create(). 。在key创建之前,所有线程的关键字值是NULL。一旦关键字被建立,每个线程可以为该关键字绑定一个值,这个绑定的值对于线程是唯一的,每个线程独立维护。第二个参数为一个函数指针,如果指针不为空,则在线程退出时将以key所关联的数据为参数调用destr_function(),释放分配的缓冲区。

2)#incude

int pthread_setspecific( pthread_key_t key, const void *value);

 此函数为TSD关键字绑定一个与本线程相关的值。参数key是TSD关键字,参数value是与本线程相关的值,value通常指向动态分配的内存空间。

3)#include

void *pthread_getspecific(pthread_key_t    key);

pthread_getspecific()函数获取与调用线程相关的TSD关键字所绑定的值。参数key是TSD关键字。该函数正常执行后返回与调用线程相关的TSD关键字所绑定的值,否则返回NULL。

4)include

int pthread_once(pthread_once_t  *once, void (*init) (void ))

pthread_once()函数使用once参数所指定的变量,保证每个进程只调用一次inti函数。通常once参数取常量PTHRAED_ONCE_INIT,它保证每个进程只调用一次init函数。


下面是使用线程安全函数的服务器端程序:(通过为每个线程设置一个私有数据data)

/*
 * =====================================================================================
 *
 *

你可能感兴趣的:(LINUX,并发,服务器,多线程,linux)