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/