これにより、デッドロックが検出されました (致命的な) エラーが発生しました
require 'thread'
@queue = Queue.new
x = @queue.pop
なぜこれが機能しないのですか?
これにより、デッドロックが検出されました (致命的な) エラーが発生しました
require 'thread'
@queue = Queue.new
x = @queue.pop
なぜこれが機能しないのですか?
キューからデータを取得します。キューが空の場合、データがキューにプッシュされるまで、呼び出しスレッドは中断されます。non_block が true の場合、スレッドは中断されず、例外が発生します。
ここでは単一のスレッドで作業しているため、キューにはオブジェクトが含まれないため、スレッドは永久に中断されます (デッドロック)。
代わりにこれを試してください
require "thread"
queue = Queue.new
thread1 = Thread.new do
5.times do |i|
x = queue.pop
sleep rand(i) # simulate workload
puts "taken #{x} from queue!"
end
end
thread2 = Thread.new do
5.times do |i|
sleep rand(i) # simulate workload
queue.push i
puts "pushed #{i} to the queue!"
end
end
thread1.join
これで 2 つのスレッドができたので、デッドロックは発生しません。キューが空になると、コンシューマ スレッドは中断されますが、2 番目のスレッドが何かをキューにプッシュすると、再びアクティブになります。