2010年5月5日13:22 Yusuke ENDOH <mame / tsg.ne.jp>:
>
> そこと Timed Condition Wait のところです。
> ただし正直、その文章を正しく理解できている自信はあまりありません。

小崎さんの話も考えると、結局、プログラマの意図が
absolute time なときは absolute time で指定し、
relative time なときは relative time で指定すべき、
なんじゃないかという気がします。

POSIX の記述にあるように、プログラマの意図が absolute time なのに
relative time で実装すると、relative time の値を計算したタイミングと
その値が wait 内で使われる間の時間が加味されません。
可能性としてはその時間にコンテキストスイッチされたりして期待するほどに
短い時間ではないかもしれない、というのが POSIX のいわんとしているところだと
理解しました。

また、[ruby-dev:41162] で指摘されているように、
システムの時刻が変わる場合、プログラマの意図が relative time なのに
absolute time で実装すると、時刻を進める場合は意図よりも早くタイムアウトし、
時刻を巻き戻す場合は意図よりも遅くタイムアウトします。
早いのは再度待てばいいことですが、遅いのは取り返しがつかないかもしれません。

これらを考えると、どちらの意図もなるべく正しく実装するには、
どちらの意図も表現できる API にすべきで、absolute time と relative time を両方
受け付けるしかないんじゃないでしょうか。

> 絶対時刻指定も new feature なので、今から 1.9.2 に盛り込むべきでない
> と思いますが、実装する人がいるなら断固反対というほどではありません。

とりあえず race は気にしないことで API だけ Time も受け付けるようにするなら
ConditionVariable#wait の先頭に

  # xxx: mutex.sleep should support Time argument.
  timeout = timeout - Time.now if timeout.kind_of? Time

と入れるとかでしょうか。
-- 
[田中 哲][たなか あきら][Tanaka Akira]