The following code generates a ThreadError (“not owner”, raised in
unlock_mutex_inner()). However, the ThreadError never gets reported at
the top level (even though my code is re-raising it and
Thread.abort_on_exception = true). A ThreadError that I raise directly
gets reported normally.
For 1.8.6-p114 (Linux), the output is:
#<ThreadError: not owner>
For 1.8.4, there is no output (so it looks like this difference has
something to do with the thread rewrite in 1.8.6).
If it doesn’t look like there’s some obvious stupidity, I’ll file a bug.
require ‘thread’
Thread.abort_on_exception = true
class MyQueue
def initialize
@q = []
@mutex = Mutex.new
@cond = ConditionVariable.new
end
def push(obj)
@mutex.synchronize do
@q << obj
@cond.signal
end
end
def pop
@mutex.synchronize do
if ([email protected])
return last
end
loop do
@cond.wait(@mutex)
if ([email protected])
return last
end
end
end
end
end
queue = MyQueue.new
def wait(queue)
#raise ThreadError, “foo bar”
# why does this behave differently than
# the “not owner” ThreadError ?
queue.pop
queue.pop
without the rescue clause the program has no exceptions–why?
rescue ThreadError => ex
p ex
raise ex # Why no exception reported at top level?
end
Thread.new {wait(queue)}
sleep 0.01
Thread.new do
queue.push “foobar”
end
sleep 0.01