樽家です。 横から失礼します。 > なんだかよくわからなくなってきたので、reltime 指定の方がよいという例を > コードで書いてみてもらえないでしょうか。 「3 秒ごとに定期処理、シグナルされたらすぐに終了」を 「3 秒はリソースを開放して定期処理、シグナルされたらすぐに終了」に すると reltimeだと create_newthread cv.wait(m,3) なのに対して、 abstimeだと create_newthread cv.wait(m,Time.now+3) としても、Time.nowを取得した後にスレッド切り替えが発生しすると、 ロックを開放している時間が短くなってしまいます。 これはreltime 指定の方がよいのではないでしょうか。 結局スレッド切り替えによる影響で考えるとどっちもどっちかと。 後は慣習的にtimeoutはreltimeだと思うのでヒューマンエラーを避けるためには、 reltime 指定の方がよいと思います。 2010年5月11日3:24 Yusuke ENDOH <mame / tsg.ne.jp>: > 遠藤です。 > > 2010年5月11日1:06 KOSAKI Motohiro <kosaki.motohiro / gmail.com>: >> あ、確認ですが、ここでいっているraceというのはabstimeに変換した直後に >> コンテキストスイッチしたらどうしよう、という話ですよね? > > pthread_cond_timedwait の RATIONALE で書かれていた問題の方です。 > この問題は CLOCK_MONOTONIC だろうとシステムクロックだろうと同じように > 発生するのではないかと思います。 > > > 「3 秒ごとに定期処理、シグナルされたらすぐに終了」の例だと、reltime > 指定だと、 > > m.synchronize do > t = Time.now + 3 > until predicate > t2 = Time.now > # (A) > cv.wait(m, t - t2) if t > t2 > break if predicate > if Time.now > t > t += 3 > # 定期処理をする > end > end > # predicate が真になった > end > > (A) の位置でコンテキストスイッチした場合、wait を呼び出す時には t2 の > 値は現在時刻から古くなってしまっているため、タイムアウトは時刻 t より > コンテキストスイッチしていた期間の分だけ確実に遅れてしまいます。 > > abstime 指定の場合、 > > m.synchronize do > t = Time.now + 3 > until predicate > # (B) > cv.wait(m, t) > break if predicate > if Time.now > t > t += 3 > # 定期処理をする > end > end > # predicate が真になった > end > > (B) の位置でコンテキストスイッチしても t の値に影響はないため、タイム > アウトするのは時刻 t で、問題ありません。 > > > なんだかよくわからなくなってきたので、reltime 指定の方がよいという例を > コードで書いてみてもらえないでしょうか。 > > -- > Yusuke Endoh <mame / tsg.ne.jp> > > -- 樽家昌也(Masaya TARUI) No Tool,No Life.