类 Thread::ConditionVariable
ConditionVariable 对象增强了类 Mutex。 使用条件变量,可以在临界区中间暂停,直到资源可用。
示例
mutex = Thread::Mutex.new resource = Thread::ConditionVariable.new a = Thread.new { mutex.synchronize { # Thread 'a' now needs the resource resource.wait(mutex) # 'a' can now have the resource } } b = Thread.new { mutex.synchronize { # Thread 'b' has finished using the resource resource.signal } }
公共类方法
new() 点击切换源码
创建一个新的条件变量实例。
static VALUE
rb_condvar_initialize(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
ccan_list_head_init(&cv->waitq);
return self;
}
公共实例方法
broadcast() 点击切换源码
唤醒所有正在等待此锁的线程。
static VALUE
rb_condvar_broadcast(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_all(&cv->waitq);
return self;
}
signal() 点击切换源码
唤醒队列中第一个等待此锁的线程。
static VALUE
rb_condvar_signal(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_one(&cv->waitq);
return self;
}
wait(mutex, timeout=nil) 点击切换源码
释放 mutex 中持有的锁并等待;在唤醒时重新获取锁。
如果给出 timeout,则即使没有其他线程发出信号,此方法也会在 timeout 秒后返回。
返回 mutex 上的睡眠结果。
static VALUE
rb_condvar_wait(int argc, VALUE *argv, VALUE self)
{
rb_execution_context_t *ec = GET_EC();
struct rb_condvar *cv = condvar_ptr(self);
struct sleep_call args;
rb_scan_args(argc, argv, "11", &args.mutex, &args.timeout);
struct sync_waiter sync_waiter = {
.self = args.mutex,
.th = ec->thread_ptr,
.fiber = nonblocking_fiber(ec->fiber_ptr)
};
ccan_list_add_tail(&cv->waitq, &sync_waiter.node);
return rb_ensure(do_sleep, (VALUE)&args, delete_from_waitq, (VALUE)&sync_waiter);
}