加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在等待某个事件时如何不占用CPU?

发布时间:2020-12-16 03:07:17 所属栏目:百科 来源:网络整理
导读:我想写一些唤醒(或睡到)某些事件的代码. 我有一段代码可以在某些事件发生之前休眠,例如在被时钟警告时. 伪代码: int main() { TimePoint someTp("3PM"); std::this_thread::sleep_until(someTP);} 这是我目前的实现,但这占据了我CPU功耗的10%左右.我认为我
我想写一些唤醒(或睡到)某些事件的代码.

我有一段代码可以在某些事件发生之前休眠,例如在被时钟警告时.

伪代码:

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

这是我目前的实现,但这占据了我CPU功耗的10%左右.我认为我的设计有缺陷,有没有更好的解决方案呢?提前谢谢了!

解决方法

问题在于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()设计用于非常有效地阻塞亚秒延迟,并且大多数操作系统都足够准确地遵守超时参数,这对于在产生CPU时的亚秒级时序非常有用.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读