当前位置: 技术问答>linux和unix
linux 线程 信号
来源: 互联网 发布时间:2017-01-19
本文导语: 问题是这样: 程序结构开辟了两个线程,整个程序目前包括主控线程一共三个线程: 线程1;线程2;主控线程。 线程1有个条件变量,当这个条件满足的时候会向GPIO口输出一个高电平,这样LED灯就会亮,程序的...
问题是这样:
程序结构开辟了两个线程,整个程序目前包括主控线程一共三个线程:
线程1;线程2;主控线程。
线程1有个条件变量,当这个条件满足的时候会向GPIO口输出一个高电平,这样LED灯就会亮,程序的需求是让这个高电平持续6秒钟,然后写入一个低电平让LED灯灭掉,线程1不能被阻塞。
想法1:
线程1设置高电平后 sleep(6),不可行,线程阻塞了。
想法2:
用闹钟,线程1注册一个信号处理函数,线程1设置一个高电平后,alarm(6),但是线程不能收到这个信号。(试验主控线程可以发一个信号给某个线程)。
这两个想法都不行,请高手指教,在线等!!
程序结构开辟了两个线程,整个程序目前包括主控线程一共三个线程:
线程1;线程2;主控线程。
线程1有个条件变量,当这个条件满足的时候会向GPIO口输出一个高电平,这样LED灯就会亮,程序的需求是让这个高电平持续6秒钟,然后写入一个低电平让LED灯灭掉,线程1不能被阻塞。
想法1:
线程1设置高电平后 sleep(6),不可行,线程阻塞了。
想法2:
用闹钟,线程1注册一个信号处理函数,线程1设置一个高电平后,alarm(6),但是线程不能收到这个信号。(试验主控线程可以发一个信号给某个线程)。
这两个想法都不行,请高手指教,在线等!!
|
想法3:
线程1判断外部变量flag为真是点亮,其他线程在flag为真是定时6秒,6秒后flag为假
线程1判断外部变量flag为真是点亮,其他线程在flag为真是定时6秒,6秒后flag为假
|
你问题描述的不是很清楚。
线程1,线程2,主控线程是个什么关系,工作是个什么顺序?
who发信号给线程1?
。。。。期待你的补充。
线程1,线程2,主控线程是个什么关系,工作是个什么顺序?
who发信号给线程1?
。。。。期待你的补充。
|
在其他不需要接收信号的线程中屏蔽SIGALRM,只在线程1中解除屏蔽
这样只有线程1可以接收信号
这样只有线程1可以接收信号
|
用select函数?
|
不知道定时器是否符合你的条件,比如settimer()之类的函数,线程不会被阻塞的。
|
记下亮灯的时间,当 当前时间-亮灯的时间>6秒时,写入一个低电平,否则写高电平或不写
|
用回调函数行不行?
|
线程1用时间函数,当设置led亮的时候,记录当前时间,然后用time()或者gettimeofday(),查询时间,
如果时间大雨6s,则写入一个低电平让LED灯灭掉
如果时间大雨6s,则写入一个低电平让LED灯灭掉
|
多线程...经验不多,总担心出莫名其妙的错误,没怎么用过多线程。
alarm应该可以实现的,计时器信号ms只会发给调用alarm的线程自己,不知道你是怎样的代码,为什么没有成功。
另外这个是linux下的么,可不可以在置为高电平的同时,又创建一个线程,这个线程会 sleep 6 秒后将LED灭掉,然后该线程退出,这样逻辑也很简单。
alarm应该可以实现的,计时器信号ms只会发给调用alarm的线程自己,不知道你是怎样的代码,为什么没有成功。
另外这个是linux下的么,可不可以在置为高电平的同时,又创建一个线程,这个线程会 sleep 6 秒后将LED灭掉,然后该线程退出,这样逻辑也很简单。
|
这个有意思,明天试试看。
sleep肯定不行的,在各种平台上的实现应该是一样的吧,就是放弃一定时间的cpu,肯定会阻塞。
定时器或者信号吧。
sleep肯定不行的,在各种平台上的实现应该是一样的吧,就是放弃一定时间的cpu,肯定会阻塞。
定时器或者信号吧。