物聯網學習教程—— 執行緒私有資料
執行緒私有資料
在多執行緒程式中,經常要用全域性變數來實現多個函式間的資料共享。由於資料空間是共享的,因此全域性變數也為所有執行緒共有。
測試程式碼如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
int key = 100; //全域性變數
void *helloworld_one(void *arg)
{
printf("the message is %s\n",(char *)arg);
key = 10;
printf("key=%d, the child id is %lu\n", key, pthread_self());
return NULL;
}
void *helloworld_two(void *arg)
{
printf("the message is %s\n", (char *)arg);
sleep(1);
printf("key=%d, the child id is %lu\n", key, pthread_self());
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t thread_id_one;
pthread_t thread_id_two;
//建立執行緒
pthread_create(&thread_id_one, NULL, helloworld_one, "helloworld_one");
pthread_create(&thread_id_two, NULL, helloworld_two, "helloworld_two");
//等待執行緒結束,回收資源
pthread_join(thread_id_one, NULL);
pthread_join(thread_id_two, NULL);
return 0;
}
執行結果如下:
由執行結果可以看出,其中一個執行緒對全域性變數的修改將影響到另一個執行緒的訪問。
但有時應用程式設計中必要提供執行緒私有的全域性變數,這個變數僅線上程中有效,但卻可以跨過多個函式訪問。比如在程式裡可能需要每個執行緒維護一個連結串列,而會使用相同的函式來操作這個連結串列,最簡單的方法就是使用同名而不同變數地址的執行緒相關資料結構。這樣的資料結構可以由 Posix 執行緒庫維護,成為執行緒私有資料 (Thread-specific Data,或稱為 TSD)。
下面介面所需標頭檔案:
#include <pthread.h>
1)建立執行緒私有資料
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
功能:
建立一個型別為 pthread_key_t 型別的私有資料變數( key )。
引數:
key:在分配( malloc )執行緒私有資料之前,需要建立和執行緒私有資料相關聯的鍵( key ),這個鍵的功能是獲得對執行緒私有資料的訪問權。
destructor:清理函式名字( 如:fun )。當執行緒退出時,如果執行緒私有資料地址不是非 NULL,此函式會自動被呼叫。該函式指標可以設成 NULL ,這樣系統將呼叫預設的清理函式。
回撥函式其定義如下:
void fun(void *arg)
{
// arg 為 key 值
}
返回值:
成功:0
失敗:非 0
不論哪個執行緒呼叫 pthread_key_create(),所建立的 key 都是所有執行緒可訪問,但各個執行緒可根據自己的需要往 key 中填入不同的值,相當於提供了一個同名不同值的變數。
2)登出執行緒私有資料
int pthread_key_delete(pthread_key_t key);
功能:
登出執行緒私有資料。這個函式並不會檢查當前是否有執行緒正使用執行緒私有資料( key ),也不會呼叫清理函式 destructor() ,而只是將執行緒私有資料( key )釋放以供下一次呼叫 pthread_key_create() 使用。
引數:
key:待登出的私有資料。
返回值:
成功:0
失敗:非 0
3)設定執行緒私有資料的關聯
int pthread_setspecific(pthread_key_t key, const void *value);
功能:
設定執行緒私有資料( key ) 和 value 關聯,注意,是 value 的值(不是所指的內容)和 key 相關聯。
引數:
key:執行緒私有資料。
value:和 key 相關聯的指標。
返回值:
成功:0
失敗:非 0
4)讀取執行緒私有資料所關聯的值
void *pthread_getspecific(pthread_key_t key);
功能:
讀取執行緒私有資料( key )所關聯的值。
引數:
key:執行緒私有資料。
返回值:
成功:執行緒私有資料( key )所關聯的值。
失敗:NULL
示例程式碼如下:
// this is the test code for pthread_key
#include <stdio.h>
#include <pthread.h>
pthread_key_t key; // 私有資料,全域性變數
void echomsg(void *t)
{
printf("[destructor] thread_id = %lu, param = %p\n", pthread_self(), t);
}
void *child1(void *arg)
{
int i = 10;
pthread_t tid = pthread_self(); //執行緒號
printf("\nset key value %d in thread %lu\n", i, tid);
pthread_setspecific(key, &i); // 設定私有資料
printf("thread one sleep 2 until thread two finish\n\n");
sleep(2);
printf("\nthread %lu returns %d, add is %p\n",
tid, *((int *)pthread_getspecific(key)), pthread_getspecific(key) );
}
void *child2(void *arg)
{
int temp = 20;
pthread_t tid = pthread_self(); //執行緒號
printf("\nset key value %d in thread %lu\n", temp, tid);
pthread_setspecific(key, &temp); //設定私有資料
sleep(1);
printf("thread %lu returns %d, add is %p\n", tid, *((int *)pthread_getspecific(key)), pthread_getspecific(key));
}
int main(void)
{
pthread_t tid1,tid2;
pthread_key_create(&key, echomsg); // 建立
pthread_create(&tid1, NULL, child1, NULL);
pthread_create(&tid2, NULL, child2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_key_delete(key); // 登出
return 0;
}
執行結果如下:
從執行結果來看,各執行緒對自己的私有資料操作互不影響。也就是說,雖然 key 是同名且全域性,但訪問的記憶體空間並不是同一個。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2658093/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 物聯網學習教程——執行緒池執行緒
- 物聯網學習教程——執行緒同步與互斥:讀寫鎖執行緒
- 物聯網學習教程——if語句
- 物聯網學習教程—Linux 可執行檔案結構與程式結構Linux
- 物聯網學習教程——switch語句
- 物聯網學習教程——if語句2
- 物聯網學習教程—字串與指標字串指標
- 物聯網學習教程—const關鍵字
- 物聯網學習教程—檔案的定位
- 物聯網學習教程—列舉型別型別
- 物聯網學習教程—Const用法和體會
- 物聯網學習教程—const用法的體會
- 物聯網學習教程—c++學習應該注意的點C++
- 物聯網學習教程——格式輸入與輸出
- 物聯網學習教程—檔案的讀寫二
- 物聯網學習教程—檔案的讀寫一
- 物聯網學習教程——一維陣列的引用陣列
- 物聯網學習教程——二維陣列的引用陣列
- 物聯網學習教程—函式的返回值函式
- 物聯網學習教程—用typedef定義型別型別
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- java 執行緒學習Java執行緒
- 執行緒池學習執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- 物聯網學習教程— 多維陣列與指標陣列指標
- 物聯網學習教程—多型的實現機制多型
- 執行緒的私有領地 ThreadLocal執行緒thread
- 多執行緒學習一執行緒
- python之多執行緒(學習)Python執行緒
- Java多執行緒學習Java執行緒
- 多執行緒學習(二)執行緒
- iOS 多執行緒-學習iOS執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- 物聯網學習教程— 字元指標作函式引數字元指標函式