class Thread::Mutex
Thread::Mutex 实现了一个简单的信号量,可用于协调多个并发线程对共享数据的访问。
示例
semaphore = Thread::Mutex.new a = Thread.new { semaphore.synchronize { # access shared resource } } b = Thread.new { semaphore.synchronize { # access shared resource } }
Public Class Methods
Public Instance Methods
Source
# File thread_sync.rb, line 100 def lock Primitive.rb_mut_lock end
尝试获取锁,如果锁不可用则等待。如果 mutex 被当前线程锁定,则引发 ThreadError。
Source
# File thread_sync.rb, line 83 def locked? Primitive.cexpr! %q{ RBOOL(mutex_locked_p(mutex_ptr(self))) } end
如果此锁当前被某个线程持有,则返回 true。
Source
# File thread_sync.rb, line 91 def owned? Primitive.rb_mut_owned_p end
如果此锁当前被当前线程持有,则返回 true。
Source
# File thread_sync.rb, line 147 def sleep(timeout = nil) Primitive.rb_mut_sleep(timeout) end
释放锁,如果提供了非 nil 的 timeout 值,则睡眠 timeout 秒,否则无限期睡眠。如果 mutex 未被当前线程锁定,则引发 ThreadError。
当线程下次被唤醒时,它将尝试重新获取锁。
请注意,此方法可能会在没有显式调用 Thread#wakeup 的情况下被唤醒。例如,接收信号等。
如果被唤醒,则返回睡眠时间(秒);如果超时,则返回 nil。
Source
# File thread_sync.rb, line 127 def synchronize raise ThreadError, "must be called with a block" unless defined?(yield) Primitive.rb_mut_synchronize end
获取锁,执行块,并在块完成后释放锁。请参阅 Thread::Mutex 下的示例。
Source
# File thread_sync.rb, line 109 def try_lock Primitive.rb_mut_trylock end
尝试获取锁并立即返回。如果成功获取锁,则返回 true。
Source
# File thread_sync.rb, line 118 def unlock Primitive.rb_mut_unlock end
尝试获取锁,如果锁不可用则等待。如果 mutex 被当前线程锁定,则引发 ThreadError。