class 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
}
}
Публичные методы класса
static VALUE
rb_condvar_initialize(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
ccan_list_head_init(&cv->waitq);
return self;
} Создаёт новый экземпляр переменной условия.
Публичные методы экземпляра
static VALUE
rb_condvar_broadcast(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_all(&cv->waitq);
return self;
} Пробуждает все потоки, ожидающие эту блокировку.
static VALUE
rb_condvar_signal(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_one(&cv->waitq);
return self;
} Пробуждает первый в очереди поток, ожидающий эту блокировку.
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);
} Освобождает блокировку, удерживаемую в mutex, и ожидает; при пробуждении блокировка захватывается повторно.
Если задано timeout, этот метод возвращается после истечения timeout секунд, даже если ни один другой поток не отправил сигнал.
При mutex возвращает результат ожидания.
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.