在多线程程序中,所有线程共享程序中的变量。Linux有一全局变量,所有线程都可以使用它,改变它的值。如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,但它的值在每一个线程中又是单独存储的。

线程存储的具体用法:

  1. 创建一个类型为pthread_key_t类型的变量。

  2. 调用pthread_key_create()来创建该变量,该函数有两个参数,第一个参数就是上面声明的 pthread_key_t变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用,该函数指针可以设成NULL,这样系统将调用默认的清理函数;

  3. 当线程中需要存储特殊值的时候,可以调用pthread_setspcific(),该函数有两个参数,第一个为前面声明的pthread_key_t变量,第二个为void*变量,这样可以存储任何类型的值;

  4. 如果需要取出所存储的值,调用pthread_getspecific(),该函数的参数为前面提到的 pthread_key_t变量,该函数返回void*类型的值;

  5. 注销使用pthread_key_delete()函数,该函数并不检查当前是否有线程正在使用,也不会调用清理函数,而只是释放以供下一次调用pthread_key_create()使用。

下面是前面提到的函数原型:

int pthread_setspecific(pthread_key_t key, const void *value);
void* pthread_getspecific(pthread_key_t key);
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t *key);

线程存储例子:

#include <pthread.h>
#include <stdio.h>


static pthread_key_t thread_key;

void* thread_function(void* args)
{
    pthread_t spid = pthread_self();

    pthread_setspecific(thread_key, (void *)spid);

    pthread_t gpid = (pthread_t)pthread_getspecific(thread_key);

    printf("set: %lu, get: %lu, %s\n", spid, gpid, (spid == gpid ? "equal":"not equal"));

    return NULL;
}

int main(int argc, char** argv)
{
    int i;
    pthread_t threads[5];

    pthread_key_create(&thread_key, NULL);

    for (i = 0; i < 5; ++i) {
        pthread_create(&(threads[i]), NULL, thread_function, NULL);
    }

    for (i = 0; i < 5; ++i) {
        pthread_join(threads[i], NULL);
    }

    pthread_key_delete(thread_key);

    return 0;
}

参考文章

pthread_key_t和pthread_key_create()的使用
Linux多线程学习(三)pthread_key_create


txgcwm
764 声望71 粉丝

Linux C/C++