多线程全局变量:线程局部变量的使用和多线程开发

     多线程现在多核时代来临的际多线程编程已经成为了时髦语有专门应运而生Erlang以及以Actor著称Scala语言下面介绍线程局部变量使用对于学习使用多线程会有些帮助   、概述

  现在多核时代多线程开发越来越重要了多线程相比于多进程有诸多优势(当然也有诸多劣势)在早期C库中有许多是线程不安全内部用到了静态变量比如:char *strtok(char *s, const char *delim); 该内部就有个静态指针如果多个线程同时可能就会出现奇怪结果当然也不是我们所想要现在LINUX对此功能有个线程安全版本接口:char *strtok_r(char *s, const char *delim, char **ptrptr)这就避免了多个线程同时访问冲突问题其实如果保持 strtok/2 接口不变同时还要保证线程安全还有个解决办法那就是采用线程局部变量

  使用线程局部变量有两种使用方式个稍微麻烦些个比较简单下面做个介绍(以LINUX为例)

   2、线程局部变量使用

  比较麻烦些使用思路方法用到主要有 3个:pthread_once(pthread_once_t*, void (*init_routine)(void)), pthread_key_create/2, pthread_specic/2, pthread_getspecic/1其中 pthread_once 可以保证在整个进程空间init_routine仅被次(它解决了多线程环境中使得互斥量和化代码都仅被问题);pthread_key_create 参数的个析构指针当某个线程终止时该析构将被并用对于个进程内给定键只能被次;pthread_sespecic 和 pthread_getspecic 用来存放和获取和个键关联例子如下:


pthread_key_t key;   
pthread_once_t once = PTHREAD_ONCE_INIT;   
 
 void destructor(void *ptr)   
{   
free(ptr);   
}   
 
void init_once(void)   
{   
pthread_key_create(&key, destructor);   
}   
 
 void *get_buf(void)   
{   
pthread_once(&once, init_once);   
 
 ((ptr = pthread_getspecic(key))  NULL) {   
ptr = malloc(1024);   
pthread_specic(key, ptr);   
}   
 (ptr);   
}   
 
 void *thread_fn(void *arg)   
{   
char *ptr = (char*) get_buf;   
 
sprf(ptr, "hello world");   
prf(">>%s\n", ptr);   
 (NULL);   
}   
 
void test(void)   
{   
   i, n = 10;   
pthread_t tids[10];   
 
for (i = 0; i < n; i) {   
pthread_create(&tids[i], NULL, thread_fn, NULL);   
}   
 
for (i = 0; i < n; i) {   
pthread_join(&tids[i], NULL);   
}   
}   


  


="xspace-totlerecord">2="xspace-totlepages">1/2="xspace-current">12>
Tags:  java多线程开发 多线程开发 java多线程变量 多线程全局变量

延伸阅读

最新评论

发表评论