Mutex.synchronize with ConditionVariable, differing outputs

I’m running the following example:

#!/usr/bin/env ruby

-- coding: utf-8 --

require ‘thread’
mutex = Mutex.new

cv = ConditionVariable.new
a = Thread.new {
mutex.synchronize {
puts “A: I have critical section, but will wait for cv”
cv.wait(mutex)
puts “A: I have critical section again! I rule!”
}
}

puts “(Later, back at the ranch…)”

b = Thread.new {
mutex.synchronize {
puts “B: Now I am critical, but am done with cv”
cv.signal
puts “B: I am still critical, finishing up”
}
}
a.join
b.join

which gives me the following output:
(Later, back at the ranch…)
A: I have critical section, but will wait for cv
B: Now I am critical, but am done with cv
B: I am still critical, finishing up
A: I have critical section again! I rule!

However, the tutorial which gave me this example illustrates that the
output should be the following:
A: I have critical section, but will wait for cv
(Later, back at the ranch…)
B: Now I am critical, but am done with cv
B: I am still critical, finishing up
A: I have critical section again! I rule!

But I can only get this output when I put
“sleep(0.000_000_000_000_000_1)”
before the “puts” statement in the main thread. So, why is the main
thread
running before thread a?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs