My problem is that I don't know how synchronise multiple threads using Ruby. The task is to create six threads and start them immediately. All of them should do some work (for example puts "Thread 1" Hi") one after another in the order I need it to work.
I've tried to work with Mutex, Monitor and Condition Variable, but all of them worked in random order. Could anybody explain how to achieve my goal?
After some time of struggling with Mutex and Condition Variable I've achieved my goal. This code is a little bit messy, and I intentionally did't use cycles for "clearer view".
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