5)執行緒私有資料
程序內的所有執行緒共享程序的資料空間,因此全域性變數為所有執行緒所共有。
但有時執行緒也需要儲存自己的私有資料,這時可以建立執行緒私有資料(
thread-specific date
)tsd
來解決。
例如我們常見的變數
errno
,它返回標準的出錯資訊。它顯然不能是乙個區域性變數,幾乎每個函式都應該可以呼叫它;但它又不能是乙個全域性變數,否則在
a執行緒裡輸出的很可能是
b執行緒的出錯資訊。要實現諸如此類的變數,我們就必須使用執行緒資料。
我們為每個執行緒資料建立乙個鍵,它和這個鍵相關聯,在各個執行緒裡,都使用這個鍵來指代執行緒資料,但在不同的執行緒裡,這個鍵代表的資料是不同的,在同乙個執行緒裡,它代表同樣的資料內容。
執行緒私有資料採用了
一鍵多值
的技術,即乙個鍵對應多個數值,訪問資料時好像是對同乙個變數進行訪問,但其實是在訪問不同的資料。
建立私有資料的函式有4個:
pthread_key_create(
建立), pthread_setspecific(
設定), pthread_getspecific(
獲取), pthread_key_delete(刪除)
。#include
int pthread_key_creadte(pthread_key_t *key,void (*destr_fuction) (void *));
int pthread_setspecific(pthread_key_t key,const void * pointer));
void * pthread_getspecific(pthread_key_t key);
int pthread_key_delete(ptherad_key_t key);
6)執行緒同步
執行緒的最大特點是資源的共享性,但資源共享中的
同步問題
是多執行緒程式設計的難點。
linux
下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數和非同步訊號。
1)互斥鎖(
mutex
)通過鎖機制實現執行緒間的同步。同一時刻只允許乙個執行緒執行乙個關鍵部分的**。
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_destroy(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *
(1)先初始化鎖
init()
或靜態賦值
pthread_mutex_t mutex=pthread_mutex_initialier
attr_t有
:pthread_mutex_timed_np:其餘執行緒等待佇列
pthread_mutex_recursive_np:巢狀鎖
,允許執行緒多次加鎖
,不同執行緒
,解鎖後重新競爭
pthread_mutex_errorcheck_np:檢錯
,與一同
,執行緒請求已用鎖,返回
edeadlk;
pthread_mutex_adaptive_np:適應鎖
,解鎖後重新競爭
(2)加鎖
,lock,trylock,lock
阻塞等待鎖
,trylock
立即返回
ebusy
(3)解鎖
,unlock
需滿足是加鎖狀態
,且由加鎖執行緒解鎖
(4)清除鎖
,destroy(
此時鎖必需
unlock,
否則返回
ebusy,//
linux下互斥鎖不占用記憶體資源
示例**
#include #include #include #include #include "iostream"
using namespace std;
pthread_mutex_t mutex = pthread_mutex_initializer;
int tmp;
void* thread(void *arg)
int main()
else
pthread_join(id, null);
pthread_mutex_destroy(&mutex);
return 0;
}
編譯:
g++ -o thread testthread.cpp -lpthread
說明:pthread
庫不是linux
系統預設的庫,連線時需要使用靜態庫
libpthread.a
,所以在使用
pthread_create()
建立執行緒,以及呼叫
pthread_atfork()
函式建立
fork
處理程式時,需要鏈結該庫。在編譯中要加
-lpthread
引數。
3 Linux多執行緒,執行緒同步
5 執行緒私有資料 程序內的所有執行緒共享程序的資料空間,因此全域性變數為所有執行緒所共有。但有時執行緒也需要儲存自己的私有資料,這時可以建立執行緒私有資料 thread specific date tsd 來解決。例如我們常見的變數 errno 它返回標準的出錯資訊。它顯然不能是乙個區域性變數,幾...
Linux多執行緒,執行緒同步
5 執行緒私有資料 程序內的所有執行緒共享程序的資料空間,因此全域性變數為所有執行緒所共有。但有時執行緒也需要儲存自己的私有資料,這時可以建立執行緒私有資料 thread specific date tsd 來解決。例如我們常見的變數 errno 它返回標準的出錯資訊。它顯然不能是乙個區域性變數,幾...
Linux多執行緒 執行緒同步
執行緒同步的概念 即當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作,而其他執行緒又處於等待狀態。在一般情況下,建立乙個執行緒是不能提高程式的執行效率的,所以要建立多個執行緒。但是多個執行緒同時執行的時候可能呼...