1require 'thread'
2
3class LocalBarrier
4  def initialize(n)
5    @wait = Queue.new
6    @done = Queue.new
7    @keeper = begin_keeper(n)
8  end
9
10  def sync
11    @done.push(true)
12    @wait.pop
13  end
14
15  def join
16    @keeper.join
17  end
18
19  private
20  def begin_keeper(n)
21    Thread.start do
22      n.times do
23        @done.pop
24      end
25      n.times do
26        @wait.push(true)
27      end
28    end
29  end
30end
31
32n = 10
33
34lb = LocalBarrier.new(n)
35
36(n - 1).times do |i|
37  Thread.start do
38    sleep((rand(n) + 1) / 10.0)
39    print "#{i}: done\n"
40    lb.sync
41    print "#{i}: cont\n"
42  end
43end
44
45lb.sync
46print "#{n-1}: cont\n"
47# lb.join # [ruby-dev:30653]
48
49print "exit.\n"
50