官术网_书友最值得收藏!

Thread local storage (TLC)

With Pthreads, TLS is accomplished using keys and methods to set thread-specific data:

pthread_key_t global_var_key;

void* worker(void* arg) {
int *p = new int;
*p = 1;
pthread_setspecific(global_var_key, p);
int* global_spec_var = (int*) pthread_getspecific(global_var_key);
*global_spec_var += 1;
pthread_setspecific(global_var_key, 0);
delete p;
pthread_exit(0);
}

In the worker thread, we allocate a new integer on the heap, and set the global key to its own value. After increasing the global variable by 1, its value will be 2, regardless of what the other threads do. We can set the global variable to 0 once we're done with it for this thread, and delete the allocated value:

int main(void) {
pthread_t threads[5];

pthread_key_create(&global_var_key, 0);
for (int i = 0; i < 5; ++i)
pthread_create(&threads[i],0,worker,0);
for (int i = 0; i < 5; ++i) {
pthread_join(threads[i], 0);
}
return 0;
}

A global key is set and used to reference the TLS variable, yet each of the threads we create can set its own value for this key.

While a thread can create its own keys, this method of handling TLS is fairly involved compared to the other APIs we're looking at in this chapter.

主站蜘蛛池模板: 印江| 革吉县| 迭部县| 锦州市| 涿鹿县| 格尔木市| 连南| 开远市| 南江县| 抚顺市| 额济纳旗| 长沙县| 墨玉县| 华蓥市| 怀安县| 湖口县| 河间市| 泰宁县| 桃源县| 科技| 郧西县| 青田县| 贵溪市| 抚宁县| 邓州市| 青铜峡市| 西充县| 招远市| 井研县| 遵化市| 苗栗县| 闵行区| 龙南县| 佳木斯市| 北安市| 江达县| 义马市| 梅河口市| 乐昌市| 湄潭县| 尼玛县|