From: Yusuke ENDOH Date: 2010-05-05T09:03:43+09:00 Subject: [ruby-core:30008] Re: [Bug #3212] ConditionVariable may become inconsistent for interrupted threads Hi, 2010/5/5 Sylvain Joyeux : > 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