1. 程式人生 > >【Linux】執行緒特定資料

【Linux】執行緒特定資料

概述

執行緒特定資料(執行緒私有資料)是儲存和查詢某個特定執行緒相關資料的一種機制,使用這種機制是因為我們希望每個執行緒可以訪問它自己單獨的資料副本,而不需要擔心與其他執行緒的訪問同步問題。
執行緒的好處就在於促進了程序中資料和屬性的共享,那麼設計執行緒私有資料的用意是什麼呢?有如下兩點原因:

  1. 有時候需要維護基於每個執行緒的資料,而建立一個全域性陣列並通過執行緒號作為索引這種方式並不方便,並且對陣列的訪問無法受到保護。
  2. 提供了讓基於程序的介面適應多執行緒環境的機制。例如errno,每個執行緒都有一個私有的errno值,在一個執行緒中對errno進行修改不會改變它在其它執行緒中的值。

我們知道一個程序中的每個執行緒都能夠訪問該程序的整個地址空間。除非使用暫存器,一個執行緒沒有辦法阻止另一個執行緒訪問它的資料,雖然在底層實現上無法阻止這種訪問,但是管理執行緒特定資料的函式可以加強執行緒間資料的獨立性。

再分配特定資料之前,需要建立與該資料關聯的鍵,這個鍵用於獲取對執行緒特定資料的訪問。鍵的資料型別:pthread_key_t

建立函式:

int pthread_key_create(pthred_key_t *keyp, void (*destructor) (void *));

建立的鍵儲存在keyp所指記憶體單元中,這個鍵可以被程序中的所有執行緒使用,每個程序把這個鍵與不同的資料相關聯。
建立時可以為該鍵關聯一個解構函式,執行緒退出時,若資料地址非空,這個函式會被呼叫。由於執行緒常使用malloc為執行緒特定資料分配記憶體,所以為防止記憶體洩漏,要在解構函式中釋放資料的記憶體。注意一個執行緒特定資料可以關聯多個鍵,每個鍵可以繫結不同的解構函式。執行緒退出時,這些解構函式會被依次呼叫。

關聯函式:

int pthread_setspecific(pthread_key_t key, const void *val);
void *pthread_getspecific(pthread_key_t key);

pthread_setspecific將鍵與特定資料的地址相關聯,通過pthread_setspecific則可以獲取與鍵相關聯的資料的地址,如果沒有資料和鍵相關聯,則返回NULL。

取消關聯函式:

int pthread_key_delete(pthread_key_t key);

該函式用於取消鍵和資料的關聯,但是呼叫該函式並不會啟用解構函式。