blob: 4f0ad030e5c688d4c299c652860e573438ef8c31 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
module ThreadSafetySpecs
# Returns the number of processors, rounded up so it's always a multiple of 2
def self.processors
require 'etc'
n = Etc.nprocessors
raise "expected at least 1 processor" if n < 1
n += 1 if n.odd? # ensure it's a multiple of 2
n
end
class Counter
def initialize
@value = 0
@mutex = Mutex.new
end
def get
@mutex.synchronize { @value }
end
def increment
@mutex.synchronize do
@value += 1
end
end
end
class Barrier
def initialize(parties)
@parties = parties
@counter = Counter.new
end
def wait
@counter.increment
Thread.pass until @counter.get == @parties
end
end
end
|