threads/condition_variable_barrier.rb

tests/_examples/threads/condition_variable_barrier.rb in the metorex repository.

# Threads meeting at a barrier: each waits until the last one arrives, and the
# last one wakes them all.
count = 4
state = 0
guard = Mutex.new
gate = ConditionVariable.new
order = []

threads = (1..count).map do |number|
  Thread.new do
    guard.synchronize do
      state += 1
      if state >= count
        order << :last
        gate.broadcast
      else
        gate.wait guard
        order << :woken
      end
    end
    number
  end
end

puts threads.map(&:value).inspect
puts order.sort.inspect
puts order.length

Output:

[1, 2, 3, 4]
[:last, :woken, :woken, :woken]
4