条件変数を提供する同期キューがあります。
その条件変数は、データがキューに追加されたときに通知します。
私は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
これはどのように正確にデッドロックを引き起こし、どのように修正しますか?