繁体   English   中英

C ++可以在“每” 100微秒内准确地执行操作,而不会暂停

[英]C++ accurately do action in “every” 100 microsecond without pausing

我编写了一个程序,需要一个循环定期循环100微秒。 我发现定期在固定时间内循环播放。 但是当循环时间设置得太小时,我发现了一个问题。

以下演示代码(不完整的代码)用于:

  1. 每100微秒增加一次count
  2. 每1秒钟显示一次count

预期结果显示每秒大约10000。

但是结果显示大约是四千秒

void f2(int input)
{
    auto start = std::chrono::system_clock::now();
    auto displayStart = std::chrono::system_clock::now();
    while(true){    //keep looping quickly
      auto now = std::chrono::system_clock::now();
      auto interval = std::chrono::duration_cast<std::chrono::microseconds>(now - start);
      if ( interval.count() > input){   //if 100 microsecond do
            count++;
            start = std::chrono::system_clock::now();
      }

      auto displayNow = std::chrono::system_clock::now();
      auto displayInterval = std::chrono::duration_cast<std::chrono::microseconds>(displayNow - displayStart);
      if ( displayInterval.count() > 1000000){  //if 1 second do
        std::cout<< "1 second count: "<<count<<std::endl;
        count=0;
        displayStart = std::chrono::system_clock::now();

      }

    }

}

之后, 我认为可能是CPU调度问题 我已经检查了程序在每个循环中是否正常工作。 每次迭代大约需要100微秒,这是准确的。 但是当程序/线程暂停并等待CPU重新调度时,可能会发生问题。

例如,让放大该值以便更清楚地说明。 线程暂停了1秒钟。 通常它将增加10000次。 但是现在,对于下一次迭代,它会检查> 100微秒,因此count ++和counter将在经过1秒后重置。 在这种情况下,计数仅增加1。

通过修改以下代码,我可以在一秒钟内完成10000 count++ 但是问题是那些10000计数不是在一秒钟内均匀分布的。 因为这只是用于测试的演示程序。 我真正想要的动作是每100微秒准确地执行一次动作 但是由于线程的暂停,我仍然找不到解决该问题的解决方案。

void f2(int input)
{
    auto start = std::chrono::system_clock::now();
    auto displayStart = std::chrono::system_clock::now();
    while(true){    //keep looping quickly
      auto now = std::chrono::system_clock::now();
      auto interval = std::chrono::duration_cast<std::chrono::microseconds>(now - start);
      if ( interval.count() > input){   //if 100 microsecond do
            for(int i=0;i<interval.count()/input;i++){    //modified part
                count++;
            }
            start = std::chrono::system_clock::now();

      }


      auto displayNow = std::chrono::system_clock::now();
      auto displayInterval = std::chrono::duration_cast<std::chrono::microseconds>(displayNow - displayStart);
      if ( displayInterval.count() > 1000000){  //if 1 second do
        std::cout<< "1 second count: "<<count<<std::endl;
        count=0;
        displayStart = std::chrono::system_clock::now();


      }


    }


}

有没有什么办法: 使过程不暂停。 将其保留在CPU中(不太可能),以使演示程序中的计数动作每100微秒起作用一次?

非常感谢你

有N个存储桶,其中N足够大,调度延迟将不会成为问题。

跟踪上一次您的衰减代码运行的时间。

当新数据包“发出”时,根据您的衰减代码的上次运行时间将其放入存储桶(如果小于100毫秒,则存储桶为0,如果小于200毫秒,则存储桶为1等)。

当衰减代码运行时,请在适当衰减所有内容后更新当前值并更新时间戳。

请注意,争用(线程更新和线程衰减)将仍然是一个问题。 您可以在对性能不敏感的代码(例如,衰减代码)中对计数器,原子标志和指针以及忙碌循环进行两次或三次缓冲,从而在某种程度上解决此问题。

或者,代替记录计数,而记录时间戳。 消耗时间戳的缓冲区,在那一点做衰减。 涉及缓冲区大小和多个线程的类似问题仍然存在,但采用类似的解决方案。

或者,在进行计数的代码中进行衰减数学运算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM