Ruby 无等待互斥同步

Ruby Mutex Synchronize without wait

http://ruby-doc.org/core-1.9.3/Mutex.html

有没有办法让 Mutex.Synchronize 立即 return 而不是等待获得锁,如果它当时被另一个线程持有?

换句话说,与 try_lock 相同的行为。

synchronize仅仅

Obtains a lock, runs the block, and releases the lock when the block completes.

这是 Rubinius 的 implementation

class Mutex
  def synchronize
    lock
    begin
      yield
    ensure
      unlock
    end
  end
end

你可以很容易地采用这个来编写你自己的try_synchronize:

class Mutex
  def try_synchronize
    return unless try_lock
    begin
      yield
    ensure
      unlock
    end
  end
end

如果没有给出块,MRI 会抛出异常,因此您可能需要添加一个:

raise ThreadError, 'must be called with a block' unless block_given?