2016-10-04 5 views
7

C++ 11標準では、sleep_until()に渡された時刻が過去になったようにシステムクロックが調整された場合に何が起こるかについて話していますが、指定された時刻がすでに過去に。`sleep_until()`が過去の時点を指定しているとき、動作は明確に定義されていますか?

私は単純に何かを見落としたのですか、それとも実際には指定されていませんか?たとえUBや実装定義ですか?

sleep_for()が負の期間で呼び出された場合も同様の疑問が生じます。

+0

これは具体的なコードケースではありません。それはむしろディスカッションです。 – Rockbar

+5

@Rockbar:それは非常に具体的であり、完璧な形式の質問です。 –

+0

私が覚えているように、仕様は異なるクロックを提供します。いくつかは強く単調に増加することが保証されています(バックジャンプしないでください)、他のものはそうではありません。 –

答えて

1

これを過度に分析しています。

標準では、「目標時間が過去であれば、ブロックまたは待機はない」と明示的に言いますか?番号

タイムステップが時間切れをどのように縮小するか説明するために外に出るのですか?はい。さらに、相対タイムアウトの観点からこれらのタイムアウトを定義します。

私はかなり明確だと思います。 ですが、にはとする必要があります。その理由は、タイムアウトがすぐに満たされれば何も起こりません。

さらに興味深い点は、どちらの場合でも瞬間的なロックとアンロックのサイクルがあるかどうかは明確に定義されていないようです。

+0

コール時に将来あったとしても、制御がスケジューラによってインプリメンテーションに到着すると、過去にあった可能性があります。だから私は、過去の時代の行動を特定するのに固有の問題がないのかどうかはわかりません。 –

+0

@ JohannesSchaub-litb:これは実装上の問題です –

+0

2番目の考えでは、渡された時刻が将来の時刻を指定するのに問題があるかもしれませんが、単調なクロックの場合、過去になることが保証されている時間を渡すことができます。 –

0

From here

現在のスレッドをブロックの実行を指定SLEEP_TIME が達成されるまで。

つまり、時間が過去であれば、それは非常に長くブロックされません。

+2

cppreference.comはISO標準文書ではありません –

+0

私はより良い参照を見つけます:P – UKMonkey

+0

ここからhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337 .pdf "絶対タイムアウトの呼び出しスレッドをブロックする" 絶対タイムアウトが過去のものだった場合、ブロックの有効期限はかなり早くなります。 – UKMonkey

4

睡眠と呼ぶまでの時間の計算sleep_until()はアトミックではありません。コンテキストの切り替えが発生し、システムが過負荷になり、スワップし、sleep_until()への実際の呼び出しがかなり遅れて発生する可能性があります。したがって、sleep_until()が時間が過去になったときに起きなければ、それは役に立たない。なぜなら、このような状況では、あなたのスレッドが起きることを決して確かめることができないからである。

この機能の要件は、標準のセクション30.2.4で規定されています。また、戻り時間はCt + Di + Dmで指定する必要があります.Ctは指定した時間、Diは割り込みのオーバーヘッド、関数のリターンとスケジューリングによる遅延、Dmはリソースの競合による遅延です。そのような場合、Diにはsleep_until()と呼ばれる前に経過した時間が含まれ、できるだけ早く関数が返されます。

+0

私は同意しません.Diは「実装品質」の遅延として記述されています。私たちがここで話していることは、DiとDm(「管理の質」の遅れ)がともにゼロであっても残る論理的な質問です。 – Jeremy

+0

'sleep_until'は、Ct + <他のスレッドがCPUを解放するまで待ちます> + <スレッドをスケジュールするのに必要な時間>に戻るために必要です。この場合、昨日やりたいのでスケジュールを立てるのに多くの時間が必要です。 –

+1

はい、遅延があなたのプログラムのどこにでも導入できるという事実は、 'std :: sleep_until(x)'を呼び出すと、xはすでに過去にあるかもしれないことを意味します。 'if(x> SomeClock :: now())std :: sleep_until(x);'を実行したとしても。これに関して、合理的で信頼できる唯一の実装は、(既に)到達したとしても過去のタイムアウトを考慮することである。 – ysdx

関連する問題