在指定的秒数后停止循环的有效方法

时间:2019-04-04 14:53:31

标签: c++ c++17

我在C ++中有一个循环,想运行几秒钟。尽管每次迭代的工作量有所不同,从几微秒到几秒,但可以在两次迭代之间停止。这是高性能代码,所以我想避免在每次迭代中计算时间差:

while (!status.has_value())
{
  // do something

  // this adds extra delays that I would like to avoid
  if (duration_cast<seconds>(system_clock::now() - started).count() >= limit)
    status = CompletedBy::duration;
}

我在想,也许有一种方法可以调度信号,然后在发生信号时停止循环,而不是在每次迭代中检查时间差。

顺便说一句,循环可能会在信号之前退出。

2 个答案:

答案 0 :(得分:-1)

我做了类似的事情,但是用Java。一般的想法是使用一个单独的线程来管理一个哨兵值,使您的循环看起来像...

okayToLoop = true;
// code to launch thread that will wait N milliseconds, and then negate okayToLoop
while((!status.hasValue()) AND (okayToLoop)) {
    // loop code
}

“注意事项”是线程的许多sleep()函数都采用“至少睡眠”语义,因此如果睡眠N毫秒真的很重要,则需要解决在您的线程实现中。但是,这避免了不断检查循环的每次迭代的持续时间。

请注意,这还将允许在检查前哨值之前完成循环的当前迭代。我还实现了这种方法,其中“控制线程”实际上中断了正在执行循环的线程,从而中断了迭代。完成此操作后,实际上已将循环放入工作线程中。

答案 1 :(得分:-1)

任何形式的线程间通信都将比对高性能时钟的简单查询要慢。

现在,steady_clock::now()在循环中可能太慢了。

使用特定于OS的API,将线程绑定为具有可笑的优先级和对特定CPU的亲和力。或在taking into account everything that can go wrong之后使用rdtsc。计算如果(a)出现问题或(b)您已超过时间阈值,则期望获得什么价值。

发生这种情况时,请检查steady_clock::now(),看看您是否足够接近完成任务,如果完成,请完成。如果没有,请计算一个新的高性能时钟目标并再次循环。