在ab中调用函数(C / C ++)的官方方式是什么? 在Linux上每1/100秒?

我有一个用C ++编写的asynchronous数据stream系统。 在数据stream体系结构中,应用程序是一组组件实例,它们在启动时初始化,然后使用预定义的消息相互通信。 有一种称为Pulsar的组件types,它向连接到它的其他组件(例如Delay)提供“时钟信号消息”。 它会每隔X ms触发一次消息(调用数据stream调度程序API),其中X是“频率”参数的值,以ms为单位。

简而言之,任务就是在每个X毫秒内调用一个函数(方法)。 问题是:最好的/正式的方法是什么? 有没有什么模式呢?

有一些方法我发现:

  • 使用SIGALRM 。 我认为,信号不适合这个目的。 尽pipe如此,分辨率是1秒,这是非常罕见的。
  • 使用硬件中断 。 我不需要这种精度。 此外,我知道使用硬件相关的解决scheme(服务器编译为几个平台,如ARM)。
  • 测量已用时间,并在下一次呼叫之前使用usleep()。 我不确定这是测量5线程调用时间相关系统调用的最佳方法,每秒10次 – 但也许我错了。
  • 使用RealTime内核函数 。 我对此一无所知。 另外,我不需要晶体精确调用,它不是一个atomreactor,我不能在某些平台上安装RT内核(也可以使用2.6.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。 我会延迟睡眠功能,直到其他想法太痛苦了。