讓我們下面的一段代碼,簡單地衡量std::this_thread::sleep_for
調用20ms的持續時間: 的std :: this_thread :: sleep_for睡覺短於預期VS2015
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main()
{
for (int i = 0; i < 20; i++)
{
auto start = steady_clock::now();
this_thread::sleep_for(milliseconds(20));
auto end = steady_clock::now();
duration<double, milli> elapsed = end - start;
cout << "Waited " << elapsed.count() << " ms\n";
}
}
運行時與工具套件編譯V120 (VS2013的),我得到的結果不如預期,即:
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
但與VS2015的工具集V140運行,結果多少有些令人吃驚和不尊重來自msdn和cppreference.com承諾說明(即sleep_for
阻止執行當前線程至少指定的sleep_duration
)。它們如下:
Waited 19.7793 ms
Waited 19.9415 ms
Waited 19.6056 ms
Waited 19.9687 ms
Waited 19.608 ms
Waited 19.589 ms
Waited 20.5435 ms
Waited 19.5669 ms
Waited 19.6802 ms
Waited 19.5381 ms
怎樣的可能,以及如何可以讓VS2015的sleep_for
只要預期至少睡覺?
的問候,的Dawid
編輯:
按照要求那些是我的設置和操作系統的詳細信息:
OS:
Windows 7專業版64位
視覺工作室:2010旗艦版,2013社區,2015年專業與更新1個
編譯器設置:
爲Win32控制檯應用程序的默認設置,
任何調試和發佈配置,
任何x86和x64目標平臺archit ectures
在早期喚醒的情況下,我通常在循環中使用'sleep_until()'。我認爲早期喚醒不應該發生,但在GCC Linux上,至少,每當進程收到信號時(顯然這裏不是你的問題),提早醒來似乎就會發生。 – Galik
我在本地看不到相同的結果或例如在http://rextester.com/l/cpp_online_compiler_visual(它也使用VS2015)。考慮添加更多有關您的確切編譯器設置,目標架構,主機操作系統,機器規格等的信息。 – Yirkha
@Yirkha:我在描述中添加了有關我的條件的更多詳細信息。至於你的結果 - 它看起來像在我的系統中尋找一點點差異。 – dawid