1

这会导致:检测到死锁(致命)错误

require 'thread'

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

为什么这不起作用?

4

1 回答 1

1

来自Queue#pop 的 Ruby 文档

从队列中检索数据。如果队列为空,则调用线程被挂起,直到数据被推入队列。如果 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

您现在有两个线程,因此您不会遇到死锁。当队列为空时,消费者线程将被挂起,但当第二个线程将某些内容推送到队列时,它将再次变为活动状态。

于 2012-07-25T23:44:33.297 回答