C++ 11では、安定したクロック(すなわち、変化しないレートでのみ前進するクロック)が使用されている場合にのみ、*_until
タイムアウト関数が「期待どおり」に動作します。対応する* _for関数の代わりにC++ 11 * _untilタイムアウト関数を使用するのが適切なのはいつですか?
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
をこれは、例えば、システムクロックはスリープ期間中に調整されていない限り、現在のスレッドが10秒間スリープ状態に発生します:system_clock
が安定したクロックではないので、それはこのようなコードはかなり意外に振る舞うことができることを意味し夏時間用です。スリープ中に1時間前にクロックを戻すと、現在のスレッドは1時間10秒間スリープ状態になります。
私が知ることから、C++ 11のすべての*_until
タイムアウト関数には対応する*_for
関数があり、タイムポイントの代わりに時間がかかります。たとえば、次のように上記のコードを書き換えることができます:*_for
機能は、彼らはただ、ない待機する時間を言うので、機能が実行されている間に調整しますクロックを心配する必要はありません
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
何待ち時間が終わったときの時間です。
この問題は、futureおよびtry_lock関数のタイムアウトベースの待機にも同じことが当てはまります。
あなたはは、アカウントにクロックの調整をしたいとき、私は非定常クロックで*_until
機能を使用する意味を作り、それを思い描くことができる唯一の状況は、例えば、だろう、あなたは3で次水曜日まで眠りたいです:たとえ今と今の間に夏時間の変更があったとしても、30AMです。 *_until
関数が*_for
関数よりも意味を成す他の状況はありますか?そうでない場合は、一般に*_for
タイムアウト関数を*_until
関数よりも優先させるべきですか?
_clock_の_steadiness_に依存しませんか? 'wait_for'と' wait_until'は本当に 'クロックジャンプ'の扱いが違うのですか? –
@ K-ballo:そうですね、私は特にクロックの安定性について言及しており、system_clockは安定していません。 '_for'関数と' _until'関数は時計の調整とは異なった振る舞いをしますが、_intention_は何もわかりません。 – KnowItAllWannabe
'system_clockの_steadiness_は実際には実装に依存します。 –