Tbpgr Blog

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

Ruby | Mutex | lock

概要

Mutex#lock -> self

詳細

mutex オブジェクトをロックする。
1つのスレッドだけがロック可能。

サンプルコード
require "thread"

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

  def increment(id)
    @m.lock
    begin
      puts "inner lock #{id}"
      @count += 1
      sleep rand(5)
    ensure
      @m.unlock
    end
  end
end

counter = Counter.new

threads = [*1..5].map do |i|
  Thread.new do |t|
    counter.increment(i)
    puts counter.count
  end
end

threads.each(&:join)

出力

inner lock 1
1
inner lock 2
2
inner lock 3
3
inner lock 4
4
inner lock 5
5

※参考までに Mutex がなかった場合

5
5
5
5
5