summaryrefslogtreecommitdiff
path: root/benchmark/vm_thread_condvar2.yml
blob: 5b5798c7c54320ebcd87e7dd7f6cc40a908b120b (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
prelude: |
  # many threads, one mutex, many condvars
benchmark:
  vm_thread_condvar2: |
    require 'thread'
    m = Mutex.new
    cv1 = ConditionVariable.new
    cv2 = ConditionVariable.new
    max = 1000
    n = 100
    waiting = 0
    scvs = []
    waiters = n.times.map do |i|
      start_cv = ConditionVariable.new
      scvs << start_cv
      start_mtx = Mutex.new
      start_mtx.synchronize do
        th = Thread.new(start_mtx, start_cv) do |sm, scv|
          m.synchronize do
            sm.synchronize { scv.signal }
            max.times do
              cv2.signal if (waiting += 1) == n
              cv1.wait(m)
            end
          end
        end
        start_cv.wait(start_mtx)
        th
      end
    end
    m.synchronize do
      max.times do
        cv2.wait(m) until waiting == n
        waiting = 0
        cv1.broadcast
      end
    end
    waiters.each(&:join)
loop_count: 1