http://blogs.wankuma.com/jitta/archive/2010/05/08/188819.aspx#FeedBack
http://blogs.wankuma.com/episteme/archive/2010/05/08/188833.aspx
その他。
事の発端は置いといてて。
Sleep(1000)の測定結果がいろいろあがっています。
何れも約1000mSec経過後、処理を再開という面では揃っているのですが、Sleep()のexit条件である、経過mSecは「1000mseecを超えた時点」ではないのね。
結果をみると、Windows OSの時刻カウンタが 15mSecなのでね、998~1014の範囲でExitしているようです。
これって、脱出判定の要素自体、15mSecでバウンドされているのかなぁ。
1000mSec以下でExitする仕様が、どうもスッキリしない。1000msecを超えた時点..としたら 1002~1017msecでexitするので、誤差が大きくなるからでしょうか。
「目覚めよ」イベントの発生はスレッド/タスクコントローラが行っているのでしょうから、そこの判定単位の問題かな。
高解像度タイマーで計測すれば、1msecでもSleep()可能なんでしょうが、仕様変更になるからできないのかも。
Client系のOSでのSQL Serverの Timer値も、15msec単位ですし。
ついでに気になったのは、Sleep(1000)で、最大でも 1013msecで目覚めているようですが、1100msecで目覚めても、仕様通りな訳ですよね。
他のスレッドやタスクの状況で変わるのでしょうが、 sleep(1000)が 1200msecなどの、大幅に遅れて目覚めるような、テスト環境って作れるのだろうか。
ノンプリマルチタスクで無限ループにすると、目覚めることすらできないと思う。 Sleep()で遊ぶのは難しそうです。
今回のSleep()騒動は、精密ドライバーが必要な場に、大工道具のドライバーを持ち込んで、且つ使い方が間違っているようなもので、なんともはや....な思いでした。
しかしそのお陰で、気にとめていなかった、Sleepの奥深さを知ることができて、良かったです。
お疲れ様でした。