2010年5月6日21:50 KOSAKI Motohiro <kosaki.motohiro / gmail.com>:

> 2) タイムアウトとspurious wakeup
>
> 1は今の議論でpredicateを呼び出し側がチェックするはずだから考慮不要という結論になったと
> 思います。2はどうしましょう?今のインターフェースだとCV#waitの戻り値はselfなので、
> 判定不可能ですよね?

タイムアウトは概念的に Thread.new { sleep t; cv.signal } みたいな話とも
考えられるので、タイムアウトというのも predicate の一種で、
wait を呼び出した側が再度検査すべき、かなぁ。

タイムアウトは条件が成立したら、その後に条件が不成立に変化することが無いので、
その再検査を省くことができそうだという点は効率の点で惜しいところですが。

一般的化すると、なんらかの知識により状態が単調に変化することがわかっていれば、
signal されたことがわかるというのは、信用できるのでしょう。

しかし、タイムアウトについては (謎の原因で) spurious wakeup した後、
検査するまでの間にタイムアウトする、という race もあるしなぁ。

再検査を避けるという以外に判定したい理由は有りますかね?
-- 
[田中 哲][たなか あきら][Tanaka Akira]