这会导致:检测到死锁(致命)错误
require 'thread'
@queue = Queue.new
x = @queue.pop
为什么这不起作用?
从队列中检索数据。如果队列为空,则调用线程被挂起,直到数据被推入队列。如果 non_block 为真,则线程不会挂起,并引发异常。
您在这里使用单个线程,因此您的队列从不包含任何对象,因此您的线程将永远挂起(死锁)。
试试这个
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
您现在有两个线程,因此您不会遇到死锁。当队列为空时,消费者线程将被挂起,但当第二个线程将某些内容推送到队列时,它将再次变为活动状态。