当前位置: 技术问答>linux和unix
请教个pthread_setspecific的用法问题
来源: 互联网 发布时间:2017-04-24
本文导语: 我现在需要把一个功能的代码改成多线程的 但是这个代码里有二十多个全局变量 考虑用pthread_key来创建私有数据 有几个问题想请教一下 1.有二十多个全局变量 是不是需要创建二十多个key啊 2.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;
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;
|
/*-
* 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 (*g_short_var_loc())
#else
char g_char_var;
short g_short_var;
int g_int_var;
long g_long_var;
#endif
#if defined _REENTRANT || defined _THREAD_SAFE
#include
#endif
#define _XOPEN_SOURCE 500
#include
#include
#include
void *work(void *ptr)
{
loginfo("tid=%010un", (unsigned)pthread_self());
g_int_var = (int)pthread_self();
sleep(rand() % 10);
loginfo("tid=%010u var=%010un", (unsigned)pthread_self(), (unsigned)g_int_var);
sleep(rand() % 10);
return NULL;
}
int main(int argc, char *argv[])
{
int i;
pthread_t tid[2];
for (i = 0; i short_var);
}
int *g_int_var_loc(void)
{
struct g_var_s *ptr;
ptr = get_var_loc();
loginfo("tid=%010u ptr=%pn", (unsigned)pthread_self(), (void *)ptr);
return &(ptr->int_var);
}
long *g_long_var_loc(void)
{
struct g_var_s *ptr;
ptr = get_var_loc();
loginfo("tid=%010u ptr=%pn", (unsigned)pthread_self(), (void *)ptr);
return &(ptr->long_var);
}
#else
#endif
|
这个东西意思不大, 就是说一个全局的key, 每个线程来说, 它们看到的value不一样.
实际上, linux下都是用__thread做局部变量的,你用的这个API意义不大。
实际上, linux下都是用__thread做局部变量的,你用的这个API意义不大。
|
把全局变量封装到一个单类,单类设计含互斥的线程安全接口,通过set/get访问。仅供参考。