当前位置:  技术问答>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;

|
本帖最后由 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     (*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意义不大。

|
把全局变量封装到一个单类,单类设计含互斥的线程安全接口,通过set/get访问。仅供参考。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • 请教,请教,这个问题是为什么????
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教一个函数入口处的汇编问题(压栈问题)
  • 请教!出现这个提示是什么原因..是模块版本问题,还是其他问题..http://220.114.102.28/xitong/ProductShow.asp?ArticleID=82
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 请教一个opengl的问题
  • 请教两个redhat9问题
  • 请教kdevelop的问题
  • 送上100分问题请教,同时学习一下进程通讯问题,望各位不吝赐教
  • 请教linux 下的adsl拨号问题.
  • 请教unix常用命令命令问题
  • 请教,帖子回复的显示问题
  • 请教关于sendto问题
  • 请教linux共享上网的问题!!!在线等,问题解决马上结贴
  • 有在用AXIS的朋友吗?请教一个问题
  • 高分请教,n简单的问题急急!!!
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教这种循环的执行过程
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教两个shell


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,