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

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.

主站蜘蛛池模板: 永丰县| 陆丰市| 西峡县| 庆安县| 明溪县| 永昌县| 台湾省| 林西县| 休宁县| 仁化县| 娄底市| 仁化县| 常宁市| 安龙县| 陇川县| 鄯善县| 阜康市| 山西省| 平原县| 麻栗坡县| 五峰| 赤城县| 手机| 哈巴河县| 阿瓦提县| 高要市| 灯塔市| 怀仁县| 麻城市| 临泉县| 淳化县| 镇江市| 巫溪县| 榆社县| 黄龙县| 五寨县| 平乐县| 治多县| 烟台市| 拜城县| 连城县|