muduo網路庫學習筆記(7):執行緒特定資料
(1)瞭解執行緒特定資料
在單執行緒程式中,我們經常要用到“全域性變數”以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問。POSIX執行緒庫通過維護一定的資料結構來解決這個問題,這個資料稱為Thread-specific Data或 TSD。執行緒特定資料也稱為執行緒本地儲存TLS(Thread-local storage)。
對於POD型別的執行緒本地儲存,可以用__thread關鍵字;對於非POD型別的執行緒本地儲存,可以用TSD來解決。
(2)執行緒特定資料的用法
第一步,建立一個型別為 pthread_key_t 型別的變數。
第二步,呼叫 pthread_key_create() 來建立該變數。該函式有兩個引數,第一個引數就是上面宣告的 pthread_key_t 變數,第二個引數是一個清理函式,用來線上程釋放該執行緒儲存的時候被呼叫。該函式指標可以設成 NULL ,這樣系統將呼叫預設的清理函式。
當執行緒中需要儲存特殊值的時候,可以呼叫 pthread_setspecific() ,該函式有兩個引數,第一個為前面宣告的 pthread_key_t 變數,第二個為 void* 變數,這樣你可以儲存任何型別的值。
如果需要取出所儲存的值,呼叫 pthread_getspecific() ,該函式的引數為前面提到的 pthread_key_t 變數,該函式返回 void * 型別的值。
函式原型如下:
#include <pthread.h>
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
void *pthread_getspecific(pthread_key_t key);
(3)部分程式碼分析
類圖:
執行緒特定資料的資料結構:
檔名:ThreadLocal.h
// 返回實際資料
// 先判定指標是否為空,為空就建立該資料並設定,不為空則直接返回該資料
T& value()
{
T* perThreadValue = static_cast<T*>
(pthread_getspecific(pkey_));
if (!perThreadValue) {
T* newObj = new T();
pthread_setspecific(pkey_, newObj);
perThreadValue = newObj;
}
return *perThreadValue;
}
檔名:ThreadLocal.h
// pthread_key_create函式中設定的清理函式,用來銷燬實際資料
static void destructor(void *x)
{
T* obj = static_cast<T*>(x);
typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]; // 檢測是否是完全型別
delete obj;
}
相關文章
- 好程式設計師大資料學習路線分享執行緒學習筆記二程式設計師大資料執行緒筆記
- 好程式設計師大資料學習路線分享多執行緒學習筆記程式設計師大資料執行緒筆記
- Python學習筆記 - 多執行緒Python筆記執行緒
- Linux程式執行緒學習筆記Linux執行緒筆記
- Java 多執行緒學習筆記Java執行緒筆記
- Python學習筆記|Python之執行緒Python筆記執行緒
- Java多執行緒學習筆記(自用)Java執行緒筆記
- muduo網路庫Timestamp類
- C# 多執行緒學習筆記 – 1C#執行緒筆記
- 物聯網學習教程—— 執行緒私有資料執行緒
- 資料庫學習筆記資料庫筆記
- Thinking in Java---多執行緒學習筆記(2)ThinkingJava執行緒筆記
- 1029學習筆記 資料庫筆記資料庫
- python學習筆記:資料庫Python筆記資料庫
- MySQL資料庫學習筆記MySql資料庫筆記
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- C# 使用執行緒池佇列(學習筆記)C#執行緒佇列筆記
- Thinking in Java--Java多執行緒學習筆記(1)ThinkingJava執行緒筆記
- 十七:主庫的DUMP執行緒(筆記)執行緒筆記
- 資料庫mysql學習筆記記錄資料庫MySql筆記
- muduo網路庫Exception異常類Exception
- muduo網路庫編譯安裝編譯
- Redis學習筆記(七) 資料庫Redis筆記資料庫
- 達夢資料庫學習筆記資料庫筆記
- Adnroid原始碼學習筆記:Handler 執行緒間通訊原始碼筆記執行緒
- 程式間通訊(linux程式與執行緒學習筆記)Linux執行緒筆記
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- Dubbo學習筆記(三) RPC核心原理和執行緒模型筆記RPC執行緒模型
- Java多執行緒學習筆記(六) 長樂未央篇Java執行緒筆記
- 多執行緒筆記執行緒筆記
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- muduo網路庫AtomicIntegerT原子整數類
- 網路流學習筆記筆記
- 【學習筆記】網路流筆記
- swoft 學習筆記之資料庫操作筆記資料庫
- 【Python3學習筆記】之【Python高階——多執行緒】Python筆記執行緒
- 好程式設計師大資料學習路線分享大資料之執行緒程式設計師大資料執行緒
- 二十二:從庫的IO執行緒(筆記)執行緒筆記
- Basic4Android主執行緒連線網路MySQL資料庫的方法Android執行緒MySql資料庫