Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Mutex | synchronize

概要

Mutex#synchronize { ... } -> object

詳細

mutex をロックし、ブロックを実行する。
実行後に必ず mutex のロックを解放する。

サンプルコード
require "thread"
require "date"

class MutexSample
  attr_reader :count
  def initialize
    @m = Mutex.new
  end

  def synchronize_test(id)
    puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}"
    @m.synchronize {
      puts "id = #{id}, inner synchronized block #{DateTime.now}"
      sleep(rand(3))
    }
    puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}"
  end
end

ms = MutexSample.new

threads = [*1..5].map do |i|
  Thread.new do |t|
    ms.synchronize_test(i)
  end
end

threads.each(&:join)

出力

$ ruby mutex_synchronize.rb
id = 1, locked? = false 2014-08-27T22:40:45+09:00
id = 3, locked? = false 2014-08-27T22:40:45+09:00
id = 5, locked? = false 2014-08-27T22:40:45+09:00
id = 1, inner synchronized block 2014-08-27T22:40:45+09:00
id = 2, locked? = false 2014-08-27T22:40:45+09:00
id = 1, locked? = false 2014-08-27T22:40:45+09:00
id = 4, locked? = false 2014-08-27T22:40:45+09:00
id = 3, inner synchronized block 2014-08-27T22:40:45+09:00
id = 3, locked? = false 2014-08-27T22:40:45+09:00
id = 5, inner synchronized block 2014-08-27T22:40:45+09:00
id = 5, locked? = true 2014-08-27T22:40:47+09:00
id = 2, inner synchronized block 2014-08-27T22:40:47+09:00
id = 2, locked? = false 2014-08-27T22:40:49+09:00
id = 4, inner synchronized block 2014-08-27T22:40:49+09:00
id = 4, locked? = false 2014-08-27T22:40:50+09:00