我有一个用C ++编写的asynchronous数据stream系统。 在数据stream体系结构中,应用程序是一组组件实例,它们在启动时初始化,然后使用预定义的消息相互通信。 有一种称为Pulsar的组件types,它向连接到它的其他组件(例如Delay)提供“时钟信号消息”。 它会每隔X ms触发一次消息(调用数据stream调度程序API),其中X是“频率”参数的值,以ms为单位。
简而言之,任务就是在每个X毫秒内调用一个函数(方法)。 问题是:最好的/正式的方法是什么? 有没有什么模式呢?
有一些方法我发现:
也许,最好的答案是一个audio/video播放器源代码(我自己无法find/理解)的简短评论部分。
更新(由@MSalters请求):DF项目的合作者使用Mac OSX,所以我们应该find一个适用于大多数Posix-compilant op的解决scheme。 系统,不仅在Linux上。 也许,将来会有一个使用BSD或者一些受限制的Linux的目标设备。
说实话,我认为在声称是一个异步数据流系统中有一个“脉冲星”是一个设计缺陷。 它可能是异步的,或者它有一个同步时钟事件。
如果你有一个需要延迟的组件,请通过boost :: asio :: deadline_timer.async_wait或者任何一个较低级别的解决方案(select()/ epoll()/ timer_create()/ etc)来请求一个组件。 无论哪种方式,最有效的C ++解决方案可能是boost.asio定时器,因为它们将使用您的Linux内核版本中最有效的方法。
如果你不需要硬实时的保证, usleep
应该做这个工作。 如果你想要硬实时保证,那么基于中断或基于实时内核的功能将是必要的。
前面提到的方法的另一种方法是在Linux 2.6.25+版本中使用定时器FD支持(几乎任何接近“当前”的发行版)。 计时器FD比以前的方法提供了更多的灵活性。
忽视设计的问题(我认为这是一个有趣的问题,但值得自己的线索)…
我首先设计一个'中断'的想法,并使用信号或某个内核函数来中断每一个X usec。 我会延迟睡眠功能,直到其他想法太痛苦了。