所有線程都可以使用它,改變它的值。
而如果每個線程希望能單獨擁有它,那麼就需要使用線程存儲了。表面上看起來這是一個全局變量,所有線程都可以使用它,
而它的值在每一個線程中又是單獨存儲的。這就是線程存儲的意義。
下面說一下線程存儲的具體用法。
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 * 類型的值。
下面是前面提到的函數的原型:
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*));
下面是一個如何使用線程存儲的例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
pthread_key_t key;
/*
* @brief free private struct
* @param[in] arg pointer of private struct
*/
void destr(void *arg)
{
int *p = (int *)arg;
printf("*arg = %u\n", (unsigned int)*p);
free(p);
}
void test(void)
{
int *p = (int *)pthread_getspecific(key);
printf("*p = %u\n", (unsigned int)*p);
}
/*
* @brief thread proc
* @param[in] arg thread parameter
* @return
*/
void *thread(void *arg)
{
int i;
pthread_t id = pthread_self();
int *p = (int *)malloc(sizeof(int));
printf("id = %u\n", (int)id);
*p = (int)id;
pthread_setspecific(key, p);
test();
return (void *)0;
}
int main(void)
{
pthread_t id;
int i;
int ret;
int pthread_arg = 100;
void *pthread_ret;
pthread_key_create(&key, destr);
ret = pthread_create(&id, NULL, thread, &pthread_arg);
if (ret != 0)
{
printf ("Create pthread error!\n");
exit (1);
}
ret = pthread_create(&id, NULL, thread, &pthread_arg);
if (ret != 0)
{
printf ("Create pthread error!\n");
exit (1);
}
sleep(5);
pthread_join(id, &pthread_ret);
printf("pthread_ret = %d\n", (int)pthread_ret);
return (0);
}