gpt4 book ai didi

ruby - MonitorMixin 条件变量 -> 死锁

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:10 27 4
gpt4 key购买 nike

我有一个提供条件变量的同步队列。

当数据添加到队列时,条件变量会发出信号。

我有 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

这究竟是如何导致死锁的,又该如何解决?

最佳答案

我想知道这是否是所有 线程在相同 条件变量上阻塞的问题,并且没有可用于入队数据的线程,这将释放其他线程。

基于这段代码中的注释:

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”,这是唯一调用@queue.enqueue的地方吗?如果是这样,那么所有线程都将在条件变量上被阻塞,并且没有一个线程能够到达能够调用 enqueue 的点。我确信 Ruby 可以检测到所有线程都锁定在同一个实体上,并且没有线程可以释放它,因此死锁。

如果您确实有一个仅入队的单独线程(这将是典型的生产者/消费者情况),请确保它不会同时等待条件变量,这也可能导致死锁。

关于ruby - MonitorMixin 条件变量 -> 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com