当前位置: 技术问答>linux和unix
请教linux下多线程的问题
来源: 互联网 发布时间:2016-08-29
本文导语: 小弟程序中有两个进程,1个主程序,1个数据采集程序 主程序是这样的 volatile int start; main{ start = 0; pthread_create(&采集线程) 接收外部信号 } 采集程序 collect{ if (start){采集程序} } 外部...
小弟程序中有两个进程,1个主程序,1个数据采集程序
主程序是这样的
volatile int start;
main{
start = 0;
pthread_create(&采集线程)
接收外部信号
}
采集程序 collect{
if (start){采集程序}
}
外部信号控制start
现在问题是:如果子线程没有启动,则一切运行良好。
子线程一旦启动,则进入采集线程,但是线程再也不出来了,传感器数据采集一直进行,
通过外部信号改变start的值也没有反应
主程序是这样的
volatile int start;
main{
start = 0;
pthread_create(&采集线程)
接收外部信号
}
采集程序 collect{
if (start){采集程序}
}
外部信号控制start
现在问题是:如果子线程没有启动,则一切运行良好。
子线程一旦启动,则进入采集线程,但是线程再也不出来了,传感器数据采集一直进行,
通过外部信号改变start的值也没有反应
|
这个程序从驱动这一层就有问题了。。。
1。
static ssize_t drv_read(struct file *filp, int *buffer, size_t count, loff_t *offp)
{
copy_to_user(buffer,(int *)&data,sizeof(int));
printk("data = %dn", *buffer);
return 4;
}
驱动中的 read 没有阻塞, 这就导致你的 应用程序不会阻塞,并且每次都能读到数据,
即使硬件中没有数据的时候,应用程序也能读到数据,而这个数据是无效的。
所以你必须在你的 driver 中加如阻塞机制,或者在硬件没有数据上来的时候,
read 然会 0。
2,进程会退出。
这个倒也好办, 在线程的最外层加上一个 while 循环就好了,记得休眠。
1。
static ssize_t drv_read(struct file *filp, int *buffer, size_t count, loff_t *offp)
{
copy_to_user(buffer,(int *)&data,sizeof(int));
printk("data = %dn", *buffer);
return 4;
}
驱动中的 read 没有阻塞, 这就导致你的 应用程序不会阻塞,并且每次都能读到数据,
即使硬件中没有数据的时候,应用程序也能读到数据,而这个数据是无效的。
所以你必须在你的 driver 中加如阻塞机制,或者在硬件没有数据上来的时候,
read 然会 0。
2,进程会退出。
这个倒也好办, 在线程的最外层加上一个 while 循环就好了,记得休眠。