c++ - 在特定秒数后停止循环的有效方法

标签 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;
}

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

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

最佳答案

我做过类似的事情,但用的是 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/

相关文章:

c++ - 在 DirectX 11 中更改分辨率

c++ - 在 C++-17 中,此构造函数是否有可能的模板推导指南?

c++ - C++ nullptr实现如何工作?

c++ - 如何让map.emplace在c++17中自动选择构造函数?

c++ - 检查共享行、列、对角线的最有效方法?

c++ - 2分区浮力优化

c++ - 什么时候抛出不同类型的异常有用?

c++ - 是否允许具有自动返回类型的函数指针作为模板参数?

c++ - 如何在 std::tuple 中合并 std::unordered_map?

c++ - 在这四个库中,您最有可能使用哪个?