前田です。

Mutex#unlockについてなのですが、

  def unlock
    return unless @locked
    Thread.critical = TRUE
    wait = @waiting
    @waiting = []
    @locked = FALSE
    Thread.critical = FALSE
    for w in wait
      w.run
    end
    self
  end

のようにロックを待っているスレッドを全部起こしていますよね?
全部のスレッドを起こしてもロックを獲得できなかったスレッドは
どうせまた寝ることになるので、

  def unlock
    return unless @locked
    Thread.critical = TRUE
    t = @waiting.shift
    @locked = FALSE
    Thread.critical = FALSE
    t.run if t
  end

でもよいような気がするのですが、これでは問題があるのでしょうか。

-- 
前田 修吾