3 Linux多執行緒,執行緒同步

2021-09-06 04:17:24 字數 2684 閱讀 6323

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多執行緒 執行緒同步

執行緒同步的概念 即當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作,而其他執行緒又處於等待狀態。在一般情況下,建立乙個執行緒是不能提高程式的執行效率的,所以要建立多個執行緒。但是多個執行緒同時執行的時候可能呼...