代码之家  ›  专栏  ›  技术社区  ›  ern0

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

  •  5
  • ern0  · 技术社区  · 14 年前

    我有一个用C++编写的异步数据流系统。在数据流体系结构中,应用程序是一组组件实例,它们在启动时初始化,然后通过预定义的消息相互通信。有一种称为脉冲星的组件类型,它向连接到其中一个组件的其他组件(例如延迟)提供“时钟信号消息”。它每x ms触发一条消息(调用数据流调度器API),其中x是以ms为单位给出的“frequency”参数的值。

    简而言之,任务只是在每x ms中调用一个函数(方法)。问题是:什么是最好的/官方的方法?有什么模式吗?

    我发现了一些方法:

    • 使用SIGALRM . 我认为,信号不适合这样做。不过,分辨率是1秒,太少了。
    • 使用硬件中断 . 我不需要这么精确。另外,我知道使用与硬件相关的解决方案(服务器是为几个平台编译的,例如ARM)。
    • 测量经过的时间和usleep(),直到下一次调用。 我不确定这是用5个线程(每秒10次)来度量与时间相关的系统调用时间的最佳方法,但也许我错了。
    • 使用实时内核函数 . 我对此一无所知。另外,我不需要Crystal Precision调用,它不是Atomreactor,我不能在某些平台上安装RT内核(另外,2.6.x内核也可用)。

    也许,最好的答案是音频/视频播放器源代码的简短注释部分(我自己无法找到/理解)。

    更新(由@msalters请求):df项目的共同作者使用的是mac osx,因此我们应该找到一个可以在大多数posix编译器操作系统上工作的解决方案,而不仅仅是在Linux上。也许,将来会有一个使用BSD的目标设备,或者一些受限制的Linux。

    4 回复  |  直到 9 年前
        1
  •  2
  •   Cubbi    14 年前

    boost::asio::deadline_timer.async_wait solution is probably the boost.asio timers, since they would be using whatever is most efficient on your linux kernel version.

        2
  •  3
  •   doron    14 年前

    usleep

        3
  •  2
  •   Rakis    14 年前

    Timer FD support in Linux Kernels 2.6.25+ (pretty much any distribution that's close to "current"). Timer FDs provide a bit more flexibility than the previous approaches.

        4
  •  1
  •   Paul Nathan    14 年前