免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9410 | 回复: 10
打印 上一主题 下一主题

线程修改了static全局变量,其它函数来读却没有变化? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-10 17:07 |只看该作者 |倒序浏览
   我创建了一个线程,主要是用来与内核用 netlink 相互通消息,收到某消息,子线程会在一个static 数组里对某位赋0或者1的值。在子进程里打印的话,这个数组里的值都是对的。
  但是在子线程外面,用别的函数来读这个static 数组的时候,返回的值就是全0. 因为别的函数来读的频率很慢,所以没有用 pthread_mutex_lock 来做保护。
  为什么别的函数来读这个全局变量,不能读到和子线程一样的值呢?

static int p_portstate[6];  

int main_loop_back(void)
{   
  pthread_t tid;
  int error;
  error=pthread_create(&tid,NULL,loop_thread_fun,NULL);
  if(error!=0)
  {
  printf("thread is not created...\n");
return -1;   
  }
  printf("create thread succes, main pid is %d\n",getpid());
  return 0;
}

// 子线程的代码可以视为:
viod loop_thread_fun()   
{  
  //从内核得到值;
  。。。。。
  //赋值
  p_portstate[i] = 1;
}
  
  然后别的函数调用,就是直接使用p_portstate数组里的值,发现打印出来是全0.。。。。。。。

请各位赐教!!  

论坛徽章:
0
2 [报告]
发表于 2012-04-10 17:35 |只看该作者
加 volatile 试试

论坛徽章:
0
3 [报告]
发表于 2012-04-10 17:51 |只看该作者
懷疑你的賦值和取值的先后順序.
你先打印確認下.

论坛徽章:
0
4 [报告]
发表于 2012-04-10 18:42 |只看该作者
static volatile int p_portstate[6];     这个试过了,没有效果。

懷疑你的賦值和取值的先后順序.

这个顺序肯定不会有问题,我是直接拨网线,此时就会有消息发到程序中来。这个我试过。如果把子线程的功能代码放在主线程里面,主线程是能立即打印出消息的。但我用子线程后,就没有打印消息了。。。。。。

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
5 [报告]
发表于 2012-04-10 19:06 |只看该作者
log

论坛徽章:
0
6 [报告]
发表于 2012-04-10 19:36 |只看该作者
我现在怀疑是进程间数据共享的问题。

我在一楼的贴子,我认为原因是主进程在创建线程后,自己退出了。于子线程也跟随退出。这个问题可以用pthread_exit(NULL) 方法解决。但是用了这个函数,我的串口也就被它占住,我不能再输入任何命令,从而无法调用第三个函数来读取这个static数组的值,从而验证是否该值被改变。

其实最早的时候,我是用fork命令,将功能代码放到子进程里的,然后主进程退出。。。。。但是发现别人来读,还是TMD读不到,现在本总终于开始意识到,别人相对于fork出的子进程而言,是不是算是另外一个进程,那。。。进程间是不能共享各自的数据的吧,一定是fork的时候,把主进程的数据也同时copy了一份给子进程。

后面准备用共享内存试试。。。。

论坛徽章:
0
7 [报告]
发表于 2012-04-11 01:13 |只看该作者
static的问题。

把static去掉,所有 c 文件 使用extern 声明:

extern volatile int p_portstate[6];

可以放到头文件中给所有c文件包含。
再在其中一个c文件中声明:
volatile int p_portstate[6];

这样所有的 c 文件才会共用同一个p_portstate,否则每个 c 文件都用各自版本的 p_portstate。

论坛徽章:
0
8 [报告]
发表于 2012-04-11 09:41 |只看该作者
我用消息队列解决此问题了。

至于楼上说的把static去掉,楼主准备有时间试一试,不过试之前对效果表示怀疑。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
9 [报告]
发表于 2012-04-11 11:23 |只看该作者
sonicling 发表于 2012-04-11 01:13
static的问题。

把static去掉,所有 c 文件 使用extern 声明:


如果LZ确实用到了多个.c文件去读取.h文件里面的static定义的全局变量的话,那么他的做法就是解决之道。
static对全局变量和全局函数修饰,实际上真正的实现是抹除符号表,正因为抹除了符号表,没有特定的名称,所以不同的.c链接的时候才不会有“XX已存在的链接错误”;
但是由于抹除的只是符号名称,实际上的实现还是单独分开的(每个.c维护自己的),所以不同的.c所访问的static全局变量实际上是不同的,这个可以用%p打印变量地址加以证明。

论坛徽章:
0
10 [报告]
发表于 2012-04-12 17:39 |只看该作者
不知道你的原因   我单独测试这个线程函数没有问题   与static没有关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP