我在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;
}
我在想,也许有一种方法可以调度信号,然后在发生信号时停止循环,而不是在每次迭代中检查时间差。
顺便说一句,循环可能会在信号之前退出。
答案 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()
,看看您是否足够接近完成任务,如果完成,请完成。如果没有,请计算一个新的高性能时钟目标并再次循环。