现在多核时代多线程开发越来越重要了多线程相比于多进程有诸多优势(当然也有诸多劣势)在早期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>
最新评论