【发布时间】:2014-07-09 03:11:46
【问题描述】:
我的问题是我不知道如何使用 Ruby 同步多个线程。任务是创建六个线程并立即启动它们。他们都应该按照我需要它工作的顺序一个接一个地做一些工作(例如puts "Thread 1" Hi")。
我尝试过使用 Mutex、Monitor 和 Condition Variable,但它们都以随机顺序工作。谁能解释一下如何实现我的目标?
经过一段时间与 Mutex 和 Condition Variable 的斗争后,我已经实现了我的目标。 这段代码有点乱,我故意不使用循环来“更清晰的视图”。
cv = ConditionVariable.new
mutex = Mutex.new
mutex2 = Mutex.new
cv2 = ConditionVariable.new
mutex3 = Mutex.new
cv3 = ConditionVariable.new
mutex4 = Mutex.new
cv4 = ConditionVariable.new
mutex5 = Mutex.new
cv5 = ConditionVariable.new
mutex6 = Mutex.new
cv6 = ConditionVariable.new
Thread.new do
mutex.synchronize {
puts 'First: Hi'
cv.wait(mutex)
puts 'First: Bye'
#cv.wait(mutex)
cv.signal
puts 'First: One more time'
}
end
Thread.new do
mutex.synchronize {
puts 'Second: Hi'
cv.signal
cv.wait(mutex)
puts 'Second:Bye'
cv.signal
}
mutex2.synchronize {
puts 'Second: Starting third'
cv2.signal
}
end
Thread.new do
mutex2.synchronize {
cv2.wait(mutex2)
puts 'Third: Hi'
}
mutex3.synchronize {
puts 'Third: Starting forth'
cv3.signal
}
end
Thread.new do
mutex3.synchronize {
cv3.wait(mutex3)
puts 'Forth: Hi'
}
mutex4.synchronize {
puts 'Forth: Starting fifth'
cv4.signal
}
end
Thread.new do
mutex4.synchronize {
cv4.wait(mutex4)
puts 'Fifth: Hi'
}
mutex5.synchronize {
puts 'Fifth: Starting sixth'
cv5.signal
}
end
Thread.new {
mutex5.synchronize {
cv5.wait(mutex5)
puts 'Sixth:Hi'
}
}
sleep 2
【问题讨论】:
-
如果你想让它们串行工作,你为什么要使用线程?
-
请先了解如何正确使用线程,然后再尝试让它们奇怪地工作。
-
不!同步与顺序无关,它与关键部分有关,您不希望多个线程同时接触同一资源,因此不会造成不一致
-
没有。同步的目的是允许并发操作。订购应以其他方式处理。 (例如,在需要完成工作之前,不要安排完成工作。)
-
大多数评论者对同步的定义过于狭隘。虽然同步通常与关键部分有关,但并非总是如此。有时它是确保 B 在 A 之后发生。
标签: ruby multithreading synchronization mutex monitor