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