Hi,

2010/5/5 Sylvain Joyeux <redmine / ruby-lang.org>:
> Doing that is not enough. CV should definitely maintain @waiter so that no thread that is *not* in #wait is not included in it.
>
> Another example: using Thread#raise. Your fix will *not* work, since we don't loop.


Ruby's ConditionVariable API obviously copies C's.
So an exception is not considered.

If you use an exception, you have to care it yourself, such as,
by adding rescue clause:

  a = Thread.start do
    mutex.synchronize do
      ...
      exc = nil
      until enc || (... "your condition" ...)
        begin
          cv.wait(mutex)
        rescue Exception
          exc = $!
        end
      end
      raise exc if exc
      ...
    end
  end

ConditionVariable API design is not Ruby-way at all.
It can be more elegant, though it is very difficult to design.
Anyway, it is a feature request.

At heart, I agree with you.  But the fix you suggested in
[ruby-core:29961] adds new critical section.  It looks benign,
but I'm not sure it is truly benign.  I'm afraid whether it has
unexpected harmful effects, such as deadlock or big performance
degradation.
Now is under release management, so I don't want to accept such
a fix without assurance.

Could anyone who is familiar with multi-thread programming check
the fix in [ruby-core:29961] and assure it has no problem?

-- 
Yusuke Endoh <mame / tsg.ne.jp>