に予想より短い眠るだけでは20msと呼ばれるstd::this_thread::sleep_for
の継続時間を計測していること、のは、次のコードを持ってみましょう: の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
EDIT:
OS:
のWindows 7 Professionalの64ビット版
-
としては、それらが私の設定やOSの詳細です要求
ビジュアル・スタジオ:アップデートと2010アルティメット、2013コミュニティ、2015 Professionalの1つの
コンパイラの設定:Win32コンソールアプリケーションの
デフォルト設定、
- デバッグのいずれかとリリース構成、
x86およびx64ターゲットプラットフォームarchit標準の実装が
*_for
タイミング機能のためのsteady_clock
使用すべきであると言っていますがectures
早起きの場合は、一般的にループで 'sleep_until()'を使用します。私は早起きは起こるはずがないと思っていますが、GCC Linuxでは、プロセスがシグナルを受信するたびに早起きが起きているようです(明らかにあなたの問題ではありません)。 – Galik
ローカルで同じ結果が表示されません。 http://rextester.com/l/cpp_online_compiler_visual(VS2015も使用しています)にあります。正確なコンパイラ設定、ターゲットアーキテクチャ、ホストOS、マシン仕様などに関する詳細情報を追加することを検討してください。 – Yirkha
@ Yirkha:私の記述の条件について詳しく説明しました。あなたの結果については、私のシステムではほとんど違いがないように見えます。 – dawid