[英]C++ accurately do action in “every” 100 microsecond without pausing
我編寫了一個程序,需要一個循環定期循環100微秒。 我發現定期在固定時間內循環播放。 但是當循環時間設置得太小時,我發現了一個問題。
以下演示代碼(不完整的代碼)用於:
count
。 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.