每隔X秒执行一次代码,但在事件中立即中断?

时间:2015-06-23 09:34:58

标签: c++ multithreading c++11

我正在寻找一种每隔X秒执行一些代码的方法,但如果在X秒内发生事件,则立即中断。

最初我有一个带有睡眠声明的while循环。然而这是有问题的,因为如果代码正在睡眠,我无法立即停止代码并且必须等到睡眠结束。

有没有简单的方法我可以执行然后睡眠,但在事件中中断这个睡眠?

编辑:选择了带有notify_all()的条件变量。

2 个答案:

答案 0 :(得分:1)

您似乎已经找到了答案,但有条件的等待互斥是这里的最佳解决方案。您实际上可以锁定互斥锁并将其放入等待条件对象以及一些超时。然后,其他一些线程可以使用相同(共享)的等待条件对象发送/通知您的线程。如果没有人在指定的超时时间内通知/发出互斥信号,则等待将暂时退出。

这种可中断睡眠的好处在于它不是一个忙碌的等待。

答案 1 :(得分:0)

我认为你不能打断睡眠,但你可以让你的代码在更短的时间内睡觉,并定期检查信号。

#include <thread>
#include <chrono>

int main()
{
  using namespace std::chrono;
  unsigned Y = 100;
  unsigned X = 1;
  bool signaled = false;
  while (!signaled)
  {
    // Do Stuff every X seconds
    high_resolution_clock::time_point const p = high_resolution_clock::now();
    while (duration_cast<milliseconds>(high_resolution_clock::now() - p).count() < 
      duration_cast<milliseconds>(std::chrono::seconds(X)).count())
    {
      // Code to check for a signal every Y milliseconds
      if (signaled)
      {
        break;
      }
      std::this_thread::sleep_for(milliseconds(Y));
    }
  }
  return 0;
}

注:系统时钟分辨率;调整信号检查频率时可能需要权衡CPU负载(取决于信号检查代码的要求);