muduo網路庫學習筆記 7 執行緒特定資料

2021-07-22 09:47:14 字數 1417 閱讀 1777

(1)了解執行緒特定資料

在單執行緒程式中,我們經常要用到「全域性變數」以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問。posix執行緒庫通過維護一定的資料結構來解決這個問題,這個資料稱為thread-specific data或 tsd。執行緒特定資料也稱為執行緒本地儲存tls(thread-local storage)。

對於pod型別的執行緒本地儲存,可以用__thread關鍵字;對於非pod型別的執行緒本地儲存,可以用tsd來解決。

(2)執行緒特定資料的用法

第一步,建立乙個型別為pthread_key_t型別的變數。

當執行緒中需要儲存特殊值的時候,可以呼叫pthread_setspecific(),該函式有兩個引數,第乙個為前面宣告的 pthread_key_t 變數,第二個為 void* 變數,這樣你可以儲存任何型別的值。

如果需要取出所儲存的值,呼叫pthread_getspecific(),該函式的引數為前面提到的 pthread_key_t 變數,該函式返回 void * 型別的值。

函式原型如下:

#include 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()

return *perthreadvalue;

}

檔名:threadlocal.h

// pthread_key_create函式中設定的清理函式,用來銷毀實際資料

static

void destructor(void *x)

muduo庫學習筆記 執行緒安全

muduo規定的必須在io執行緒完成的操作 連線的更新 連線的讀寫 連線的關閉 連線的析構等 tcpserver start 將acceptor listen置於所屬執行緒?一直不理解為什麼這裡需要將listen放到其所屬執行緒中 因為listen的描述符一定是在io執行緒中的 可能原因是其他從re...

linux多執行緒網路庫 muduo庫學習

什麼是muduo庫 muduo 是基於 reactor 模式 執行緒安全的 支援多核多執行緒的簡單易用的網路庫。符合現代c 程式設計規範 大量使用boost的開源網路庫。為什麼學習muduo庫 muduo庫對學習linux下面向過程c 程式設計 多執行緒程式設計 boost庫應用實踐,有非常大的幫助...

muduo網路庫學習筆記 5 執行緒池的實現

生產者 消費者問題也被稱為有界緩衝區問題,兩個程序 執行緒共享乙個公共的固定大小的緩衝區。其中乙個是生產者,將資訊放入緩衝區 另乙個是消費者,從緩衝區中取出資訊。問題在於當緩衝區已滿,而此時生產者還想向其中放入乙個新的資料項的情況。其解決方法就是讓生產者休眠,待消費者從緩衝區中取出乙個或多個資料項時...