我有一个线程在消息队列上等待(阻塞)要处理的消息。 轮询不是一种选择。
当某个 START 消息到达时,我们会设置一些变量,然后必须在给定的时间延迟后重置,或者在另一个 STOP 消息到达时重置。如果已设置,重复的 START 应该将设置时间延长给定时间段(可能只是重新启动)。
与此同时,线程应继续处理其他到达的消息。
在我看来,这样做的方法是生成并分离一个新的pthread来处理超时。该线程将超时并在退出之前向父级发送 STOP 消息,或者如果父线程收到 STOP 消息则会过早地被杀死/取消。 / p>
我一直在阅读pthreads文档,对我来说,最好的方法并不完全清楚:
我可以创建一个只能在给定时间内休眠的线程 发送停止消息,如果停止,则发送pthread_cancel() 消息更快到达。它似乎隐含在文档中(但没有明确说明),在这种情况下,“取消”操作基本上会在睡眠中止死线程,不会采取进一步行动。
我可以根据this示例创建一个使用pthread_cond_timedwait()等待条件的线程。这看起来最“合适”但也是最麻烦的。
类似于1的东西,但fork()监视一个标志变量的进程,如果标志被重置,则超时或放弃。
使用SIGALARM处理程序,加上Alarm()来设置/取消设置定时信号(听起来很简单,但练习看起来有点凌乱,你只能有一个警报)
延迟在秒范围内,精确到~0.1秒会很好。我并不热衷于pthread_cond_timedwait使用绝对时间的方式,因为用户可能会设置时钟并抛出一些东西(不是世界末日,但它对我来说似乎不是最佳的)。 / p>
从网络上的示例中我不清楚“pthread_cancel”或“pthread_cond_timedwait”是否为分离的线程干净地工作干净?
我不会发布我当前喜欢的选项的代码,因为它几乎是选项2中example的复制粘贴。
答案 0 :(得分:1)
我看不出你在为什么而苦恼。尽管我理解你的描述,但定时器显然是要走的路。
timer_create
创建一个计时器,以便在时间过去后发送信号。如果您所做的只是设置变量开关,这很容易在信号处理程序本身timer_settime
timer_gettime
获取计时器剩余时间,向其添加新的时间,并使用timer_settime
重置计时器。 / LI>
与alarm
或itimer
间隔计时器不同,您不限于一个计时器。
顺便说一句,如果您使用的是POSIX消息队列而且您的消息很少,那么可能值得使用mq_notify
。您可以将其设置为每当在先前为空的队列中放入新消息时启动线程而不是在mq_receive
上进行阻塞,而只需处理任何和所有消息,直到队列再次为空并且线程结束。