日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++多线程编程之十】pthread线程私有数据

發布時間:2025/3/15 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++多线程编程之十】pthread线程私有数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程編程之線程私有數據

? ? ?Pthread POSIX threads 的簡稱,是POSIX線程標準

? ? ? ??線程同步從互斥量C/C++多線程編程之六】pthread互斥量信號量C/C++多線程編程之七】pthread信號量,條件變量C/C++多線程編程之八】pthread條件變量,讀寫鎖C/C++多線程編程之九】pthread讀寫鎖多線程的同步機制已經有了清晰深入的探究,多線程編程的精髓所在,需要深入理解。

? ? ? ?線程私有數據TSD(Thread-specific?Data),在【C/C++多線程編程之五】pthread線程深入理解中有提及,進程全局變量是被所有線程共享的,處于功能與安全的需求,有必要為線程提供線程全局變量。線程全局變量便是線程私有數據,僅在某個線程內有效。

? ? ? ?

? ? ? ? ? ??1.?線程私有數據

? ? ? ??線程私有數據通過關聯的鍵值key識別,創建時將私有數據與key關聯,通過key向線程私有數據寫入內容,也通過key讀取線程私有數據的內容,最后通過key 刪除線程私有數據。?

? ? ? ? 線程私有數據創建后,該進程內所有的線程都可以使用這個key向線程私有數據寫入與讀取數據。對不同的線程而言,同一個key值,分別訪問線程自己的私有數據,互不影響。

? ? ? ? 舉例:

? ? ? ? 創建關聯key的線程私有數據后,每個線程都有一份對應的線程私有數據。

? ? ? ? 線程A通過key訪問線程A中的對應的線程私有數據。

? ? ? ? 線程B通過key訪問線程B中的對應的線程私有數據。

? ? ? ??2.線程私有數據基本函數

? ? ? ? #include<pthread.h>

創建線程私有數據

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

? ? ? ? 該函數的第一個參數為鍵值key,第二個參數為銷毀函數(一般設為NULL,不為空時,銷毀線程私有數據時,會調用該函數以釋放分配的內存)。

寫入數據

? ? ? ??int?pthread_setspecific(pthread_key_t ?key, ?void ?*pointer);

? ? ? ? 該函數的第一個參數為鍵值key,第二個參數為寫入數據指針(該指針類型為void* ,可以寫入指向任何數據類型的指針)。pointer寫入的是這個指針的值,而不是pointer指向的內容。

讀取數據

? ? ? ??void *?pthread_getspecific(pthread_key_t key);

? ? ? ? 該函數的參數為鍵值key,返回寫入的數據。如果線程沒有寫入數據,則返回空指針。child3驗證)

銷毀線程私有數據

? ? ? ??int?pthread_key_delete(pthread_key_t key);

? ? ? ? 該函數的參數為鍵值key,用于銷毀線程私有數據。

? ? ? ??3.牛刀小試:

? ? ? ? 線程child1,child2均把自己的線程ID寫入自己的線程私有數據中,寫入的是一個指針,在讀出的數據是void *型的指針,需要對其進行強制類型轉換。

?

?

#include "pthread.h"

#include "sched.h"

#include "semaphore.h"

#include "stdio.h"

#include "windows.h"

?

#pragma comment(lib, "pthreadVC2.lib")???? //必須加上這句

?

pthread_key_t?? key;

?

pthread_t tid1,*p1;

pthread_t tid2,*p2;

pthread_t tid3, *p3;

?

void * child1(void *arg)

{

p1=&tid1;

?

pthread_setspecific(key,p1);?????? //將線程id寫入線程私有數據

?

p1=(pthread_t *)pthread_getspecific(key);?? //讀取線程私有數據

?

printf("線程child1 的私有數據: %d\n",*p1);

return NULL;

}

?

void * child2(void *arg)

{

p2=&tid2;

?

pthread_setspecific(key,p2);?????? //將線程id寫入線程私有數據

?

p2=(pthread_t *)pthread_getspecific(key);??? //讀取線程私有數據

?

printf("線程child2的私有數據:%d\n",*p2);

?

Sleep(500);

?

return NULL;

}

?

// 不寫數據 直接讀 測試

void *child3(void *arg)

{

p3 = (pthread_t *)pthread_getspecific(key); // 發現讀出來的為空指針

?

if (p3 == NULL)

{

printf("p3 is null.\n");

}

else

{

printf("現場childtest的私有數據:%d", *p3);

}

?

Sleep(100);

?

return NULL;

}

?

?

int main(void)

{

pthread_key_create(&key,NULL);????? //創建線程私有數據

?

pthread_create(&tid1,NULL,child1,NULL);

pthread_create(&tid2,NULL,child2,NULL);

pthread_create(&tid3, NULL, child3, NULL);

?

Sleep(100000);

?

pthread_key_delete(key);??????????? //銷毀線程私有數據

return 0;

}

?

來自 <https://blog.csdn.net/lovecodeless/article/details/24983131>

總結

以上是生活随笔為你收集整理的【C/C++多线程编程之十】pthread线程私有数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。