日期:2014-05-16  浏览次数:20908 次

请教个pthread_setspecific的用法问题
我现在需要把一个功能的代码改成多线程的 但是这个代码里有二十多个全局变量 考虑用pthread_key来创建私有数据 有几个问题想请教一下
1.有二十多个全局变量 是不是需要创建二十多个key啊

2.pthread_setspecific是对键值进行设置 那么每次键值发生变化都需要设置一次吗 

3.pthread_setspecific是紧接着赋值语句后设置 还是可以在函数最下面设置啊 
比如下面这段代码 Overflow是个全局变量 是需要像蓝色部分一样 每次赋值都要set一下呢 还是只需要在函数结束的地方set一下呢
if (L_var1 > 0X00007fffL)
{
      Overflow = 1;
      var_out = MAX_16;
}
else
{
      Overflow = 0;
      
      var_out = extract_l(L_var1);
}
pthread_setspecific(key, Overflow);
if ((var2 > 15 && var1 != 0) || (resultat != (Word32)((Word16) resultat)))
{
      Overflow = 1;
      pthread_setspecific(key23, Overflow);
      var_out = (var1 > 0) ? MAX_16 : MIN_16;
}
else
{
      var_out = extract_l(resultat);
}
pthread_setspecific(key, Overflow);


pthread_setspecific(key, Overflow);

4.每次获取key值时都需要用pthread_getspecific(key)吗 
比如下面的代码 需要加上红色部分吗 Overflow是全局变量
pthread_getspecific(key);
L_var_out = L_var1 + L_var2 + Overflow;
多线程

------解决方案--------------------
本帖最后由 mymtom 于 2013-09-11 17:40:28 编辑
可以把需要变成线程私有数据的的变量组织成一个结构体,用一个key就可以了。

/*-
 * Copyright (C) 2013, mymtom
 *
 * vi:set ts=4 sw=4:
 */
#ifndef lint
static const char rcsid[] = "$Id$";
#endif /* not lint */

/**
 * @file        tls.c
 * @brief       
 */

#define loginfo(fmt, ...)       printf("%s-%03d: " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
//#define loginfo printf
#define _REENTRANT 1


/* 全局变量 */

#if defined _REENTRANT 
------解决方案--------------------
 defined _THREAD_SAFE

char  *g_char_var_loc(void);
short *g_short_var_loc(void);
int   *g_int_var_loc(void);
long  *g_long_var_loc(void);

#define g_int_var       (*g_int_var_loc())
#define g_char_var      (*g_char_var_loc())
#define g_long_var      (*g_long_var_loc())
#define g_short_var   &n