线程特定数据
来源:互联网 发布:淘宝上卖什么比较热销 编辑:程序博客网 时间:2024/05/14 03:52
1. 在单线程程序中,我们经常用到全局变量以实现在多个函数间共享数据。
2. 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程共有。
3. 但有时应用程序设计中有必要提供私有的全局变量,仅在某个线程中有效,却可以跨多个函数访问。
程序运行结果:可以发现程序分别输出了自己的线程名称和自己value的地址,说明value=(tsd*)pthread_getspecific(key_tsd)输入了不同的key_tsd,互不影响,各自有自己的“全局变量”。
2. 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程共有。
3. 但有时应用程序设计中有必要提供私有的全局变量,仅在某个线程中有效,却可以跨多个函数访问。
4. POSIX线程库通过维护一定的数据结构来解决这个问题,这些个数据成为TSD(Thread-specific Data)。
相关函数:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t key);
void *pthread_getspecific(pthread_key_t key);
int pthread_setsepcific(pthread_key_t key, const void *value);
int pthread_once(pthread_once_t *once_control, void(*init_routine)(void));
pthread_once_t once_control=PTHREAD_ONCE_INIT;
#include<pthread.h>#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<stdlib.h>#include<errno.h>#include<string.h>#define ERR_EXIT(m) do{perror(m);exit(EXIT_FAILURE);}while(0)pthread_key_t key_tsd;pthread_once_t once_control = PTHREAD_ONCE_INIT;struct tsd{ pthread_t tid; char *str;};void destroy_routine(void *value){ printf("destroy\n"); free(value);}void once_routine(void){ pthread_key_create(&key_tsd,destroy_routine); printf("key init....\n");}void* thread_routine(void *arg){ // pthread_once(&once_control,once_routine); tsd *value=(tsd*)malloc(sizeof(tsd)); value->tid=pthread_self(); value->str=(char*)arg; pthread_setspecific(key_tsd, value); printf("%s setspecific %p\n",(char*)arg,value); value=(tsd*)pthread_getspecific(key_tsd); printf("tid=%x,str=%s\n",(int)value->tid,value->str); sleep(2); value=(tsd*)pthread_getspecific(key_tsd); printf("tid=%x,str=%s\n",(int)value->tid,value->str); return NULL;}int main(){ pthread_key_create(&key_tsd,destroy_routine); pthread_t tid1,tid2; char ch1[]="thread1"; char ch2[]="thread2"; pthread_create(&tid1,NULL,thread_routine,(void*)ch1); pthread_create(&tid2,NULL,thread_routine,(void*)ch2); pthread_join(tid1,NULL); pthread_join(tid2,NULL); pthread_key_delete(key_tsd); return 0;}
程序运行结果:可以发现程序分别输出了自己的线程名称和自己value的地址,说明value=(tsd*)pthread_getspecific(key_tsd)输入了不同的key_tsd,互不影响,各自有自己的“全局变量”。
pthread_once(&once_control,once_routine);这个程序只会在进入的第一个线程里执行once_routine函数。
阅读全文
0 0
- 线程特定数据
- 线程特定数据详解
- 线程特定数据
- 线程特定数据
- 线程特定数据
- 线程特定数据
- 线程特定数据
- 线程特定数据
- 线程特定数据(学习)
- 线程特定数据(学习)
- 线程特定数据(学习)
- 线程特定数据TSD总结
- 线程特定数据(TSD)
- 12.线程特定数据TSD
- [转]加强线程特定数据的理解
- 线程特定数据的小程序。
- 线程特定数据函数的使用
- Linux多线程实践(4) --线程特定数据
- wpa_cli中文问题处理
- 剖析C++如何实现重载
- 在 MAC / WINDOWS 使用Docker
- 【框架学习】springMVC转json输出(fastjson)
- kafka优点
- 线程特定数据
- POI各Jar包的作用
- hdu 1123 Complicated Expressions 重点后缀表达式转中缀表达式
- HDU 5517 二维树状数组
- R语言相关系数的可视化
- UVA
- 学生代码笔记- 0.1
- 一篇实用的Latex的入门教程
- Class对象