簡體   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