執行緒本地儲存

2021-07-14 11:07:52 字數 1687 閱讀 3152

對於多執行緒程式,所有執行緒共享全域性和靜態變數,任何執行緒使用變數之後都會在其他執行緒可見,因此對於執行順序非常重要的場景,需要使用多重方式來進行同步確保執行緒安全。但是,如果希望每個執行緒單獨擁有乙個全域性或靜態變數,所有執行緒都可以使用它,但是在每個執行緒中是單獨儲存的,那麼就需要使用執行緒本地儲存。

經典的pthread執行緒庫提供了對執行緒本地儲存的完全支援,具體需要使用如下三個函式:

//將需要共享的變數轉換為void*指標,繫結到pthread_key_t關聯的全域性物件中

int pthread_setspecific(pthread_key_t key, const void *value);

//從繫結到pthread_key_t型別的全域性變數中獲取需要的資料,返回型別需要從void*轉換為實際型別

void *pthread_getspecific(pthread_key_t key);

//建立乙個全域性關聯變數,第二個引數是指定對使用者關聯的資料進行釋放的handler

int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));

建立乙個型別為pthread_key_t型別的變數。

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

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

針對這些c風格函式操作,下面使用c++模板封裝了乙個范型版本。

template

class threadspecificutil

static t * get()

static

intset(t *data)

private:

static

void initkey()

static

void datadestructor(void *p)

}private:

static pthread_key_t _s_key;

static pthread_once_t _s_once;

};template

pthread_key_t threadspecificutil::_s_key;

template

pthread_once_t threadspecificutil::_s_once = pthread_once_init;

上述使用的pthread_once函式用來完成初始化工作,建立乙個全域性的pthread_key_t型別的變數,保證多個執行緒中只有乙個來完成這個初始化工作。

c++11標準新新增了thread_local關鍵字,用來標識新的儲存型別。

thread_local int j = 0;

void foo()

void func()

執行緒本地儲存 TLS

執行緒本地儲存 tls 是乙個方法,通過該方法,給定的多執行緒程序中的每個執行緒都可以分配儲存執行緒特定資料的位置。動態繫結 執行時 執行緒特定資料是通過 tls api tlsalloc tlsgetvalue tlssetvalue 和tlsfree 的方式支援的。除了現有的 api 實現,wi...

執行緒本地儲存 declspec thread

執行緒本地儲存 thread local storage,tls 簡單分析與使用 在多執行緒程式設計中,同乙個變數,如果要讓多個執行緒共享訪問,那麼這個變數可以使用關鍵字volatile進行宣告 那麼如果乙個變數不想使多個執行緒共享訪問,那麼該怎麼辦呢?呵呵,這個辦法就是tls,執行緒本地儲存.它的...

vc中線程的本地儲存

執行緒的本地儲存 tls tls的作用 當多個執行緒使用同乙個全域性或者靜態變數的時候 由於各個執行緒會各自對該變數賦值操作,那麼資料會被 不同的執行緒覆蓋,即這些變數對於執行緒只有乙個副本。為了各自執行緒儲存各自的資料,所以引入了tls,一旦使用了 tls,變數會對各個執行緒產生不同的副本,各個執...