# list0704.rb

require 'thread'

mem = 0               # 共有変数
m = Mutex::new	      # 相互排除を管理するための変数m

t1 = Thread::fork{
  1000.times{
      m.synchronize{  # 共有変数への読み書きはクリティカルなので
	x = mem       # 相互排除の管理下で実行する。
	sleep(0.01)   # この区間をクリティカルセクションという
	mem = x + 2
      }      
  }
}

t2 = Thread::fork{
  1000.times{
      m.synchronize{
	y = mem
	sleep(0.01)
	mem = y + 1
      }
  }
}

t1.join
t2.join
puts mem