1

これにより、デッドロックが検出されました (致命的な) エラーが発生しました

require 'thread'

@queue = Queue.new
x = @queue.pop

なぜこれが機能しないのですか?

4

1 に答える 1

1

Queue#pop の Ruby ドキュメントから:

キューからデータを取得します。キューが空の場合、データがキューにプッシュされるまで、呼び出しスレッドは中断されます。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 番目のスレッドが何かをキューにプッシュすると、再びアクティブになります。

于 2012-07-25T23:44:33.297 に答える