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 } }
公共类方法
源代码
static VALUE
mutex_initialize(VALUE self)
{
return self;
}
创建一个新的 Mutex
公共实例方法
源代码
VALUE
rb_mutex_lock(VALUE self)
{
return do_mutex_lock(self, 1);
}
尝试获取锁,如果锁不可用则等待。如果 mutex 被当前线程锁定,则会引发 ThreadError 错误。
源代码
VALUE
rb_mutex_locked_p(VALUE self)
{
rb_mutex_t *mutex = mutex_ptr(self);
return RBOOL(mutex->fiber);
}
如果此锁当前被某个线程持有,则返回 true。
源代码
VALUE
rb_mutex_owned_p(VALUE self)
{
rb_fiber_t *fiber = GET_EC()->fiber_ptr;
rb_mutex_t *mutex = mutex_ptr(self);
return mutex_owned_p(fiber, mutex);
}
如果此锁当前被当前线程持有,则返回 true。
源代码
static VALUE
mutex_sleep(int argc, VALUE *argv, VALUE self)
{
VALUE timeout;
timeout = rb_check_arity(argc, 0, 1) ? argv[0] : Qnil;
return rb_mutex_sleep(self, timeout);
}
释放锁,并休眠 timeout 秒(如果给定且非 nil),或者永远休眠。如果 mutex 没有被当前线程锁定,则会引发 ThreadError 错误。
当线程下次被唤醒时,它将尝试重新获取锁。
请注意,此方法可以在没有显式 Thread#wakeup 调用的情况下唤醒。例如,接收信号等等。
如果被唤醒,则返回休眠的时间(以秒为单位),如果超时,则返回 nil。
源代码
static VALUE
rb_mutex_synchronize_m(VALUE self)
{
if (!rb_block_given_p()) {
rb_raise(rb_eThreadError, "must be called with a block");
}
return rb_mutex_synchronize(self, rb_yield, Qundef);
}
获取锁,运行代码块,并在代码块完成时释放锁。请参阅 Thread::Mutex 下的示例。
源代码
VALUE
rb_mutex_trylock(VALUE self)
{
rb_mutex_t *mutex = mutex_ptr(self);
if (mutex->fiber == 0) {
RUBY_DEBUG_LOG("%p ok", mutex);
rb_fiber_t *fiber = GET_EC()->fiber_ptr;
rb_thread_t *th = GET_THREAD();
mutex->fiber = fiber;
mutex_locked(th, self);
return Qtrue;
}
else {
RUBY_DEBUG_LOG("%p ng", mutex);
return Qfalse;
}
}
尝试获取锁并立即返回。如果锁被授予,则返回 true。
源代码
VALUE
rb_mutex_unlock(VALUE self)
{
const char *err;
rb_mutex_t *mutex = mutex_ptr(self);
rb_thread_t *th = GET_THREAD();
err = rb_mutex_unlock_th(mutex, th, GET_EC()->fiber_ptr);
if (err) rb_raise(rb_eThreadError, "%s", err);
return self;
}
释放锁。如果 mutex 没有被当前线程锁定,则会引发 ThreadError 错误。