如何在等待某些事件时不占用CPU
How not to hog CPU while waiting for some event?
我想写一些代码,在某个事件上唤醒(或睡眠直到(某个事件。
我有一段代码,它会休眠,直到某些事件发生,例如当被时钟闹钟时。
伪代码:
int main() {
TimePoint someTp("3PM");
std::this_thread::sleep_until(someTP);
}
这是我目前的实现,但这占用了我大约 10% 的 CPU 功率。我认为我的设计有缺陷,有没有更好的解决方案?提前非常感谢!
问题在于调用 sleep_for(..)
的 std::this_thread:sleep_until(..)
的实现,它调用 nanosleep()
。
(参见 GNU 源代码,第 271 行。
请参阅以下堆栈溢出问题:
- 纳睡眠高CPU使用率? (调用 nanosleep 的 Linux 高 CPU 问题。
- boost::this_thread::sleep(( vs. nanosleep((?
您似乎不需要nanosleep()
的高分辨率。 您可以使用宽松的开源许可证编写自己的解决方案,并调用sleep()
而不是nanosleep().
如果您确实需要亚秒级分辨率,我建议您使用调用select()
而不是nanosleep()
的技术。 select()
旨在非常有效地阻止亚秒级延迟,并且大多数操作系统都足够准确地遵守超时参数,因此它在产生CPU的同时可用于亚秒级计时。
您甚至可以在 error_fds
参数中创建一个套接字来传递给 select()
,其中套接字在传递给 close()
并成为"错误"状态套接字时可以用作跨线程"信号"。
更好的解决方案是使用事件驱动的库,如 Boost.Asio 或 libevent,而不是休眠一段时间。
一个简单的实现可以是使用Semaphore
。
在信号灯上阻止worker thread
,并从闹钟事件发生的另一个线程发出semaphore
信号。
void* workerThread(void*)
{
TimePoint someTp("3PM");
sem_Wait(); //Thread remains blocked here
}
void timercallback()
{
sem_post(); //Signals worker thread to move ahead
}
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何禁用 CPU 的无序执行
- 如何创建事件驱动的 SDL2 应用程序
- Qt QTableView paint() 事件无限期交付,占用 100% 的 CPU 内核
- 如何在等待某些事件时不占用CPU
- C/ c++中CPU使用事件通知