あなたの質問と他の回答はすべて違いを繰り返しています。指定さwait_for
れた時間だけ待機し、指定wait_until
された時点まで待機しますが、その意味は詳しく説明されていません。
にtime_point
は関連付けられたクロックがあり、そのクロックは、適切な時間が来たかどうかを判断するために使用されます。これは、関数によってクロック調整が考慮されることを意味しwait_until
ます。wait_until(..., system_clock::now() + std::chrono::seconds(10))
時計がたまたま 1 時間前に調整された場合、1 時間 10 秒待機することになる可能性があります。
デュレーションには関連付けられたクロックがないためwait_for
、独自のクロックが選択されます。標準では、std::steady_clock を使用することが指定されています。これは調整できず、リアルタイムに対して一定の速度で進みます。これは、wait_for
クロックに加えられた調整に関係なく、指定された時間待機することを意味します。wait_for(..., std::chrono::seconds(10))
10 秒間待機することが保証されています (+ 実装が機能し、スケジュールの問題が発生するまでの時間)。
スレッドのスピンとスリープに関して違いはありません。aswait_for
は、 で呼び出されたかのように動作するように指定されていwait_until
ますsteady_clock::now() + duration
。
これが綴られている標準の部分は次のとおりです。
[thread.req.timing] 30.2.4/2-4
2実装では、タイムアウトからの復帰に必ずある程度の遅延があります。割り込み応答、関数の戻り、およびスケジューリングのオーバーヘッドは、期間D iとして表される「実装の品質」の遅延を引き起こします。理想的には、この遅延はゼロです。さらに、プロセッサおよびメモリリソースの競合は、持続時間Dmとして表される「管理品質」の遅延を誘発する。遅延時間はタイムアウトごとに異なる場合がありますが、すべての場合で短い方が優れています。
3名前が で終わるメンバー関数は_for
、期間を指定する引数を取ります。これらの関数は、相対的なタイムアウトを生成します。実装では、安定したクロックを使用してこれらの機能の時間を測定する必要があります。期間引数D tを指定すると、タイムアウトのリアルタイム期間はD t + D i + D mになります。
4名前が で終わるメンバー関数は_until
、時点を指定する引数を取ります。これらの関数は絶対タイムアウトを生成します。実装では、これらの関数の時間を測定するために、時点で指定されたクロックを使用する必要があります。クロック時刻引数C tを指定すると、タイムアウト中にクロックが調整されない場合、タイムアウトから戻るクロック時刻ポイントは
C t + D i + D mになります。タイムアウト中にクロックが時間C aに調整される場合、動作は次のようになります。
— C a > C tの場合、タイムアウトがすでに満たされているため、待機関数はできるだけ早く起動する必要があります。つまり、C a + D i + D mです。[注:この指定により、安定したクロックに対して測定すると、待機の合計時間が減少する可能性があります。—終了注
]
— C a <= C tの場合、待機関数は
、時刻C n >= C tClock::now()
を返すまで、つまり、 C t + D i + D mでウェイクするまでタイムアウトしてはなりません。. [
注:クロックが後方に調整されると、安定したクロックに対して測定すると、この指定により、合計待機時間が増加する可能性があります。クロックが順方向に調整されると、この指定により、安定したクロックに対して測定すると、待機の合計時間が減少する可能性があります。--end note ]実装は、上記で指定された時間から、 C tと関数の呼び出しの時点との
差で安定したクロックの相対タイムアウトから戻る時間までの任意の時点で、そのようなタイムアウトから戻る必要があります。[注:実装は、クロックが順方向に調整されるときに待機時間を短縮する必要があります。—終わりのメモ_until
]