当前位置: 技术问答>linux和unix
线程修改了static数据,为什么别的函数读不到?
来源: 互联网 发布时间:2017-02-15
本文导语: 我创建了一个线程,主要是用来与内核用 netlink 相互通消息,收到某消息,子线程会在一个static 数组里对某位赋0或者1的值。在子进程里打印的话,这个数组里的值都是对的。 但是在子线程外面,用别的...
我创建了一个线程,主要是用来与内核用 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 %dn",getpid());
return 0;
}
// 子线程的代码可以视为:
viod loop_thread_fun()
{
//从内核得到值;
。。。。。
//赋值
p_portstate[i] = 1;
}
然后别的函数调用,就是直接使用p_portstate数组里的值,发现打印出来是全0.。。。。。。。
请各位赐教!!
但是在子线程外面,用别的函数来读这个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 %dn",getpid());
return 0;
}
// 子线程的代码可以视为:
viod loop_thread_fun()
{
//从内核得到值;
。。。。。
//赋值
p_portstate[i] = 1;
}
然后别的函数调用,就是直接使用p_portstate数组里的值,发现打印出来是全0.。。。。。。。
请各位赐教!!
|
你确认子进程的代码走到了吗?
看你上面的分析,有可能是在 pthread_create()后,主进程仍然被先调度执行,然后退出,导致子进程没有机会执行。
加 pthread_exit()能避免这个问题。
如果用 fork的话,那主进程和子进程就有两份不同的静态数据了。
看你上面的分析,有可能是在 pthread_create()后,主进程仍然被先调度执行,然后退出,导致子进程没有机会执行。
加 pthread_exit()能避免这个问题。
如果用 fork的话,那主进程和子进程就有两份不同的静态数据了。
|
用你的片段程序编写了一个测试程序,从主线程中输出p_portstate的值
执行结果显示值变为1 了
执行结果显示值变为1 了
|
试试定义为volatile
static volatile int p_portstate[6];
static volatile int p_portstate[6];
|
什么意思?
UNIX书上写fork调用之后,子进程是父进程的副本,子进程获得父进程空间数据空间,堆栈副本,父子进程不共享存储空间部分,只共享正文段
|
还有 你主线程是怎么退出的?是return ,exit的话 进程就终止了!怎么还能调用子线程去读呢?
|
你可以试下 在子线程中读 同时在 主线程里面也读 看看能不能同时又数据?还有试试吧static 定义的东西换成全局的试试 是不是static 定义域出了问题