C++11 では、*_until
タイムアウト関数は、安定したクロック (つまり、不変の速度でのみ前進するクロック) が使用されている場合にのみ、「期待どおり」に動作します。system_clock
は安定したクロックではないため、次のようなコードは非常に驚くべき動作をする可能性があります。
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
これにより、現在のスレッドは、スリープ期間中 (夏時間など) にシステム クロックが調整されない限り、10 秒間スリープ状態になります。スリープ中にクロックを 1 時間戻すと、現在のスレッドは 1 時間 10 秒間スリープします。
私が知る限り*_until
、C++11 のすべてのタイムアウト関数には、タイム*_for
ポイントではなく期間を取る対応する関数があります。たとえば、上記のコードは次のように書き換えることができます。
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
関数は、*_for
関数の実行中に調整されるクロックについて心配する必要はありません。待機が終了したときの時間ではなく、待機時間を指定するだけだからです。
Future および try_lock 関数でのタイムアウトベースの待機についても同様であるため、この問題はスリープ関数以外にも影響します。
*_until
不安定なクロックで機能を使用することが理にかなっていると想像できる唯一の状況は、クロックの調整を考慮したい場合です。現在とその後の間のサマータイムへ、またはサマータイムから。*_until
関数が関数よりも意味を持つ他の状況はあり*_for
ますか? *_for
そうでない場合、一般的に、タイムアウト関数は関数よりも優先されるべきであると言っても過言ではありません*_until
か?