[英]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_for
在std::future
對象可用后立即返回,即沒有實現
while(!ready){
std::this_thread::sleep_for(10ms);
}
這是有保證的嗎?
一旦共享狀態准備好,或者超時(加上一點)過去,該函數將返回。 根據 [futures.unique.future]/21 函數的效果是
如果共享狀態包含延遲函數 ([futures.async]),則為 None,否則阻塞直到共享狀態准備好或直到 rel_time 指定的相對超時 ([thread.req.timing]) 到期。
強調我的
實現在從超時返回時必然有一些延遲。 中斷響應、函數返回和調度中的任何開銷都會導致“實現質量”延遲,表示為持續時間
Di
。 理想情況下,該延遲為零。 此外,處理器和內存資源的任何爭用都會導致“管理質量”延遲,表示為持續時間Dm
。 延遲持續時間可能因超時而異,但在所有情況下,越短越好。名稱以 _for 結尾的函數采用指定持續時間的參數。 這些函數產生相對超時。 實現應該使用穩定的時鍾來測量這些函數的時間
Dt
給定持續時間參數Dt
,超時的實時持續時間是Dt+Di+Dm
。
其中談到在函數實際返回之前可能會增加超時的額外時間。
您正在搶占式多線程環境中工作; 沒有什么“立即”發生。 一旦您通過阻塞(或它竊取您的時間片)將您的時間片交給操作系統,您就已經放棄了控制權。 互斥鎖解鎖后,操作系統將在某個時候解除對線程的阻塞。 操作系統試圖對這些事情做出提示,但不能保證。
您所能希望的最好結果是“不久之后”。 wait_for
會讓你知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.