簡體   English   中英

測量 std::future 對象可用之前的時間

[英]Measure time until an std::future object becomes available

我正在嘗試測量返回std::future對象的 API 調用的持續時間。

我目前的方法是這樣的:

std::chrono::high_resolution_clock::time_point endTime, startTime = std::chrono::high_resolution_clock::now();

std::shared_future<API::response> responseFuture = API::request();

std::future_status status = responseFuture.wait_for(3s); // Some Timeout

if (status == std::future_status::ready)
  endTime = std::chrono::high_resolution_clock::now();
else
  // error handling

但是,我不確定std::future::wait_for cppreference.com指出:

由於調度或資源爭用延遲,此函數可能會阻塞比 timeout_duration 更長的時間。

我不擔心阻塞時間長於 timeout_duration,但我確實需要wait_forstd::future對象可用后立即返回,即沒有實現

while(!ready){
  std::this_thread::sleep_for(10ms);
}

這是有保證的嗎?

一旦共享狀態准備好,或者超時(加上一點)過去,該函數將返回。 根據 [futures.unique.future]/21 函數的效果是

如果共享狀態包含延遲函數 ([futures.async]),則為 None,否則阻塞直到共享狀態准備好或直到 rel_time 指定的相對超時 ([thread.req.timing]) 到期。

強調我的

[thread.req.timing]

  1. 實現在從超時返回時必然有一些延遲。 中斷響應、函數返回和調度中的任何開銷都會導致“實現質量”延遲,表示為持續時間Di 理想情況下,該延遲為零。 此外,處理器和內存資源的任何爭用都會導致“管理質量”延遲,表示為持續時間Dm 延遲持續時間可能因超時而異,但在所有情況下,越短越好。

  2. 名稱以 _for 結尾的函數采用指定持續時間的參數。 這些函數產生相對超時。 實現應該使用穩定的時鍾來測量這些函數的時間Dt給定持續時間參數Dt ,超時的實時持續時間是Dt+Di+Dm

其中談到在函數實際返回之前可能會增加超時的額外時間。

您正在搶占式多線程環境中工作; 沒有什么“立即”發生。 一旦您通過阻塞(或它竊取您的時間片)將您的時間片交給操作系統,您就已經放棄了控制權。 互斥鎖解鎖后,操作系統將在某個時候解除對線程的阻塞。 操作系統試圖對這些事情做出提示,但不能保證。

您所能希望的最好結果是“不久之后”。 wait_for會讓你知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM