首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在特定秒数后停止循环的有效方法

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

Stack Overflow用户
提问于 2019-04-04 22:53:31
回答 2查看 138关注 0票数 1

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

代码语言:javascript
运行
复制
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;
}

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-04-04 23:05:16

我也做过类似的事情,但用的是Java。一般的想法是使用一个单独的线程来管理一个标记值,使你的循环看起来像...

代码语言:javascript
运行
复制
okayToLoop = true;
// code to launch thread that will wait N milliseconds, and then negate okayToLoop
while((!status.hasValue()) AND (okayToLoop)) {
    // loop code
}

但是,这避免了不断检查循环的每次迭代的持续时间。

请注意,这还将允许在检查标记值之前完成循环的当前迭代。我还实现了这种方法,其中“控制线程”实际上中断了执行循环的线程,从而中断了迭代。当我这样做的时候,我实际上已经将循环放到了一个工作线程中。

票数 -1
EN

Stack Overflow用户

发布于 2019-04-04 23:55:09

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

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

使用特定于操作系统的API,将您的线程绑定为对特定CPU具有荒谬的优先级和亲和力。或者在taking into account everything that can go wrong之后使用rdtsc。如果(a)出了什么问题,或者(b)你已经超过了时间阈值,那么计算你期望得到的值。

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55519039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档