线程修改了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 定义域出了问题