Issue #11496 has been updated by Motohiro KOSAKI. inserting sleep is unacceptable because sleep invokes volunteer context switch and changes a meaning and a purpose of the test. Instead, I'd like to insert a waste loop to trigger a thread preemption race. like this 100.times { m = Mutex.new r = 0 num_threads = 10 loop=100 (1..num_threads).map{ Thread.new do loop.times do m.synchronize{ tmp = r 100.times { # waste loop } r = tmp + 1 } end end }.each{|e| e.join } raise unless r == num_threads*loop } puts "pass" ---------------------------------------- Bug #11496: Mutex#synchronize testing code should be data race. https://bugs.ruby-lang.org/issues/11496#change-54199 * Author: Yuki Kurihara * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.3.0dev (2015-08-28 trunk 51715) [x86_64-darwin14] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- Current Mutex#synchronize testing code is not to fail every time if not use Mutex#synchronize. ~~~ruby 100.times { r = 0 max = 10 (1..max).map{ Thread.new{ i=0 while i<max*max i+=1 r += 1 end } }.each{|e| e.join } raise unless r == 1000 } puts "pass" ~~~ So, I propose this patch. ---Files-------------------------------- mutex-synchronize.patch (424 Bytes) -- https://bugs.ruby-lang.org/