Object
Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.
Example:
require 'thread' semaphore = Mutex.new a = Thread.new { semaphore.synchronize { # access shared resource } } b = Thread.new { semaphore.synchronize { # access shared resource } }
Creates a new Mutex
# File thread.rb, line 60 def initialize @waiting = [] @locked = false; @waiting.taint # enable tainted comunication self.taint end
If the mutex is locked, unlocks the mutex, wakes one waiting thread, and yields in a critical section.
# File thread.rb, line 140 def exclusive_unlock return unless @locked Thread.exclusive do @locked = false begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end yield end self end
Attempts to grab the lock and waits if it isn't available.
# File thread.rb, line 92 def lock while (Thread.critical = true; @locked) @waiting.push Thread.current Thread.stop end @locked = true Thread.critical = false self end
Returns true
if this lock is currently held by some thread.
# File thread.rb, line 70 def locked? @locked end
Obtains a lock, runs the block, and releases the lock when the block completes. See the example under Mutex.
# File thread.rb, line 127 def synchronize lock begin yield ensure unlock end end
Attempts to obtain the lock and returns immediately. Returns
true
if the lock was granted.
# File thread.rb, line 78 def try_lock result = false Thread.critical = true unless @locked @locked = true result = true end Thread.critical = false result end
Releases the lock. Returns nil
if ref wasn't locked.
# File thread.rb, line 105 def unlock return unless @locked Thread.critical = true @locked = false begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end Thread.critical = false begin t.run if t rescue ThreadError end self end