Ruby Threads Concurrency Issue using Mutex

40 views Asked by At
require 'thread'

mutex = Mutex.new


shared_resource = 0

  for i in 0..10000
    Thread.new do
      mutex.synchronize { shared_resource += 1 }
    end
    Thread.new do
      mutex.synchronize { shared_resource -= 1 }
    end
  end

puts shared_resource

I am trying to run this Ruby program to test mutex.synchronize and get 0 on every run but everytime I run this program It gives me random value. Need help with solving this to get 0 and help me understand how to use Mutex and lock in Ruby

1

There are 1 answers

0
engineersmnky On BEST ANSWER

Your issue is not the mutex, since synchronize will lock it during block execution. Your issue is that the thread execution has not completed when you reach puts shared_resource.

To solve this you need to ensure that all the threads have completed by calling Thread#join for example:

require 'thread'

mutex = Mutex.new

shared_resource = 0
threads = []

400.times do |i|
  threads << Thread.new do
    mutex.synchronize {shared_resource += 1}
  end
  threads << Thread.new do
    mutex.synchronize {shared_resource -= 1}
  end
end

puts shared_resource
#=> some number

# see how many threads are still running 
puts threads.map(&:status)

threads.map(&:join)

puts shared_resource
#=> 0