我在 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;
}
我在想的是,也许有一种方法可以安排信号,然后在它发生时停止循环,而不是在每次迭代时检查时间差。
顺便说一句,循环可能会在信号之前退出。
最佳答案
我做过类似的事情,但用的是 Java。一般的想法是使用一个单独的线程来管理一个哨兵值,使你的循环看起来像......
okayToLoop = true;
// code to launch thread that will wait N milliseconds, and then negate okayToLoop
while((!status.hasValue()) AND (okayToLoop)) {
// loop code
}
“注意事项”是许多线程的 sleep() 函数采用“至少 sleep ”语义,因此如果仅 sleep N 毫秒真的很重要,您需要解决在你的线程实现中。但是,这避免了不断检查循环的每次迭代的持续时间。
请注意,这也将允许循环的当前迭代在检查标记值之前完成。我还实现了这种方法,其中“控制线程”实际上中断了正在执行循环的线程,从而中断了迭代。完成此操作后,我实际上已将循环放入工作线程。
关于c++ - 在特定秒数后停止循环的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55519039/