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

时间:2011-06-09 16:20:37

标签: c++ multithreading events c++11

我想编写一些在某些事件中醒来(或睡觉直到)的代码。

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

伪代码:

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

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

3 个答案:

答案 0 :(得分:8)

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

(参见gnu sources第271行。)

请参阅以下Stackoverflow问题:

您似乎不需要nanosleep()的高分辨率。您可以使用许可的开源许可编写自己的解决方案,并致电sleep()而不是nanosleep().

如果您确实需要亚秒级分辨率,我建议使用select()而非nanosleep()的方法。 select()旨在非常有效地阻止亚秒延迟,并且大多数操作系统都足够准确地遵守超时参数,这对于亚秒计时非常有用,同时产生CPU。

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

答案 1 :(得分:3)

更好的解决方案是使用事件驱动的库,例如Boost.Asiolibevent,而不是在一段时间内休眠。

答案 2 :(得分:1)

一个简单的实现可以是使用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

}