Tbpgr Blog

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

Ruby | Mutex | try_lock

概要

Mutex#try_lock -> bool

詳細

mutex をロックしようとして、ロックが成功した場合、真を返します。
ロックできなかった場合にはブロックせず偽を返します。

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

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

  def sleep_test(id)
    puts "id = #{id}, locked? = #{@m.locked?}"
    ret = @m.try_lock
    puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}"
    if ret
      puts "id = #{id}, success lock"
      @m.sleep(rand(3))
      @m.unlock
    else
      puts "id = #{id}, fail lock"
    end
    puts "id = #{id}, locked? = #{@m.locked?} #{DateTime.now}"
  end
end

ms = MutexSample.new

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

threads.each(&:join)

出力

$ ruby mutex_try_lock.rb
id = 1, locked? = falseid = 2, locked? = false
id = 3, locked? = false

id = 2, locked? = true 2014-08-28T22:43:08+09:00
id = 2, success lock
id = 5, locked? = falseid = 3, locked? = true 2014-08-28T22:43:08+09:00
id = 3, fail lock
id = 1, locked? = true 2014-08-28T22:43:08+09:00

id = 3, locked? = false 2014-08-28T22:43:08+09:00
id = 1, fail lock
id = 4, locked? = true
id = 1, locked? = true 2014-08-28T22:43:08+09:00
id = 5, locked? = true 2014-08-28T22:43:08+09:00
id = 5, success lock
id = 4, locked? = true 2014-08-28T22:43:08+09:00
id = 4, fail lock
id = 4, locked? = false 2014-08-28T22:43:08+09:00
id = 2, locked? = false 2014-08-28T22:43:09+09:00
id = 5, locked? = false 2014-08-28T22:43:10+09:00