我有一个提供条件变量的同步队列。
当数据添加到队列中时,该条件变量会发出信号。
我有 5 个线程:
Thread.new do
loop do
@queue.synchronize {
cond.wait_until { @queue.has_data? || @queue.finished? }
}
# some processing code that can also call @queue.enqueue
end
end
然后我做:
@queue.enqueue some_data
@threads.each(&:join)
MyQueue#enqueue
看起来像这样:
def enqueue(data)
synchronize do
@pending << v unless queued?(data) || processed?(data) || processing?(data)
data_cond.signal
end
end
def finished?
@started && @processing.empty? && @pending.empty?
end
def has_data?
!@pending.empty?
end
然后我开始#join
deadlock detected
这究竟是如何导致死锁的,如何解决它?