From: Yusuke ENDOH Date: 2010-05-11T12:38:02+09:00 Subject: [ruby-dev:41268] Re: MonitorMixin::ConditionVariable#wait timeout 遠藤です。 2010年5月11日4:14 Masaya TARUI : > 「3 秒ごとに定期処理、シグナルされたらすぐに終了」を > 「3 秒はリソースを開放して定期処理、シグナルされたらすぐに終了」に > すると > > reltimeだと > create_newthread > cv.wait(m,3) > なのに対して、 > > abstimeだと > create_newthread > cv.wait(m,Time.now+3) > としても、Time.nowを取得した後にスレッド切り替えが発生しすると、 > ロックを開放している時間が短くなってしまいます。 > > これはreltime 指定の方がよいのではないでしょうか。 > 結局スレッド切り替えによる影響で考えるとどっちもどっちかと。 「正確に 3 秒間 Mutex を開放する」という需要があるのか、あったとして 正当なものかわからないのですが、spurious wakeup を考えると、原理的に 達成不可能な要求だと思います。 通算で 3 秒間開放することも難しそうです。 t = 3 until predicate t1 = Time.now cv.wait(m, t) # (A) t -= Time.now - t1 if t <= 0 # timeout predicate = true end end spurious wakeup 後に (A) の箇所でコンテキストスイッチしたら、通算でも 3 秒間より短い期間しか開放されません。何か手があるでしょうか。 -- Yusuke Endoh