我想编写一些代码,这些代码会在某个事件唤醒(或进入休眠状态)。

我有一段代码会一直休眠,直到发生某些事件(例如,由时钟提醒时)为止。

伪代码:

int main() {
  TimePoint someTp("3PM");
  std::this_thread::sleep_until(someTP);
}

这是我目前的实现方式,但这消耗了我大约10%的CPU能力。我认为我的设计有缺陷,对此是否有更好的解决方案?提前谢谢了!

最佳答案

问题在于调用std::this_thread:sleep_until(..)sleep_for(..)的实现,调用nanosleep()的实现。

(请参见gnu sources,第271行。)

请参阅以下Stackoverflow问题:

  • nanosleep high cpu usage?(Linux高CPU问题,调用nanosleep。)
  • boost::this_thread::sleep() vs. nanosleep()?

  • 您似乎不需要nanosleep()的高分辨率。您可以使用许可的开源许可证编写自己的解决方案,然后调用sleep()而不是nanosleep().
    如果您确实需要亚秒级的分辨率,我建议您使用select()而不是nanosleep()的技术。 select()旨在非常有效地阻止亚秒级延迟,并且大多数操作系统都足够准确地遵守了timeout参数,该参数对于产生CPU时的亚秒级时序很有用。

    您甚至可以在o​​jit_code参数中创建一个用于传递给select()的套接字,当该套接字传递给error_fds并成为“错误”状态套接字时,该套接字可以用作跨线程“信号”。

    10-07 19:07
    查看更多