summaryrefslogtreecommitdiff
path: root/benchmark/vm_thread_condvar2.yml
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/vm_thread_condvar2.yml')
-rw-r--r--benchmark/vm_thread_condvar2.yml39
1 files changed, 39 insertions, 0 deletions
diff --git a/benchmark/vm_thread_condvar2.yml b/benchmark/vm_thread_condvar2.yml
new file mode 100644
index 0000000..5b5798c
--- /dev/null
+++ b/benchmark/vm_thread_condvar2.yml
@@ -0,0 +1,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