33

私が使用している参考文献は、次のように2つを説明しています。

  • wait_for「条件変数が起動されるか、指定されたタイムアウト期間が経過するまで、現在のスレッドをブロックします」

  • wait_until「条件変数が起動されるか、指定された時点に到達するまで、現在のスレッドをブロックします」

違いはなんですか?wait_untilシグナルが送信されたときにスレッドが正確に (多かれ少なかれ) 続行できるようにスピンしますが、wait_forその時点でスレッドをスケジューリングに戻すだけですか?

4

4 に答える 4

55

違いは、待機時間の表現方法にありwait_forます。相対時間(「最大10秒待機」)とwait_until絶対時間(「2012年10月30日の12:00まで待機」)がかかります。

時間パラメータの宣言を比較します。

// wait_for:
const std::chrono::duration<Rep, Period>& rel_time

// wait_until:
const std::chrono::time_point<Clock, Duration>& abs_time
于 2012-10-30T15:28:07.733 に答える
33

あなたの質問と他の回答はすべて違いを繰り返しています。指定さ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として表される「実装の品質」の遅延を引き起こします。理想的には、この遅延はゼロです。さらに、プロセッサおよびメモリリソースの競合は、持続時間Dとして表される「管理品質」の遅延を誘発する。遅延時間はタイムアウトごとに異なる場合がありますが、すべての場合で短い方が優れています。

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]

于 2012-10-30T15:36:46.197 に答える
5
  • wait_for一定時間待機します。たとえば、2秒間待機します。
  • wait_untilしばらく待つ。たとえば、2013年7月23日午後11時22分34秒に達するまで待機します。
于 2012-10-30T15:28:03.207 に答える