我想编写一些代码,这些代码会在某个事件唤醒(或进入休眠状态)。
我有一段代码会一直休眠,直到发生某些事件(例如,由时钟提醒时)为止。
伪代码:
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()
的高分辨率。您可以使用许可的开源许可证编写自己的解决方案,然后调用sleep()
而不是nanosleep().
如果您确实需要亚秒级的分辨率,我建议您使用
select()
而不是nanosleep()
的技术。 select()
旨在非常有效地阻止亚秒级延迟,并且大多数操作系统都足够准确地遵守了timeout参数,该参数对于产生CPU时的亚秒级时序很有用。您甚至可以在ojit_code参数中创建一个用于传递给
select()
的套接字,当该套接字传递给error_fds
并成为“错误”状态套接字时,该套接字可以用作跨线程“信号”。