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

线程修改了static数据,为什么别的函数读不到?
我创建了一个线程,主要是用来与内核用 netlink 相互通消息,收到某消息,子线程会在一个static 数组里对某位赋0或者1的值。在子进程里打印的话,这个数组里的值都是对的。
  但是在子线程外面,用别的函数来读这个static 数组的时候,返回的值就是全0. 因为别的函数来读的频率很慢,所以没有用 pthread_mutex_lock 来做保护。

  为什么别的函数来读这个全局变量,不能读到和子线程一样的值呢?

[code=C/C++][/code]
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;
}
[code=C/C++][/code]
 
  然后别的函数调用,就是直接使用p_portstate数组里的值,发现打印出来是全0.。。。。。。。
  请各位赐教!!

------解决方案--------------------
试试定义为volatile

static volatile int p_portstate[6];
------解决方案--------------------
用你的片段程序编写了一个测试程序,从主线程中输出p_portstate的值

执行结果显示值变为1 了
------解决方案--------------------
你确认子进程的代码走到了吗?
看你上面的分析,有可能是在 pthread_create()后,主进程仍然被先调度执行,然后退出,导致子进程没有机会执行。
加 pthread_exit()能避免这个问题。
如果用 fork的话,那主进程和子进程就有两份不同的静态数据了。
------解决方案--------------------
探讨

别人相对于fork出的子进程而言,是不是算是另外一个进程

------解决方案--------------------
还有 你主线程是怎么退出的?是return ,exit的话 进程就终止了!怎么还能调用子线程去读呢?
------解决方案--------------------
你可以试下 在子线程中读 同时在 主线程里面也读 看看能不能同时又数据?还有试试吧static 定义的东西换成全局的试试 是不是static 定义域出了问题