【发布时间】:2021-11-15 19:50:34
【问题描述】:
我有一个作业,我有 2 个数字(a 和 b)和一个计数(n)。我需要首先生成随机数,这将是每个线程休眠的时间。然后,每个线程分别计算 a 和 b 的和、差、乘积和除法,并重复 n 次。例如:
a = 10
b = 2
n = 2
SUM: 12
DIFFERENCE: 8
PRODUCT: 20
DIVISION: 5
SUM: 12
DIFFERENCE: 8
PRODUCT: 20
DIVISION: 5
在每一行之间,程序会休眠几秒钟。顺序必须是和、差、积和除。我不能重复使用队列或杀死/生成线程。我的第一个想法是使用 4 个条件变量来指示线程需要运行的顺序。我想出了这个:
mutex = Mutex.new
resources = Array.new(4) { ConditionVariable.new }
t1 = Thread.new do
mutex.synchronize do
puts "Thread 1"
sleep(3)
resources[0].signal
end
end
t2 = Thread.new do
mutex.synchronize do
resources[0].wait(mutex)
puts "Thread 2"
sleep(3)
resources[1].signal
end
end
t3 = Thread.new do
mutex.synchronize do
resources[1].wait(mutex)
puts "Thread 3"
sleep(3)
resources[2].signal
end
end
t4 = Thread.new do
mutex.synchronize do
resources[2].wait(mutex)
puts "Thread 4"
sleep(3)
end
end
t1.join
t2.join
t3.join
t4.join
但我遇到了这个死锁错误:main.rb:39:in 'join': No live threads left. Deadlock? (fatal)
这种方法可行吗?我应该怎么做才能修复它?还有其他更好的方法吗?
【问题讨论】:
标签: ruby multithreading mutex