класс ConditionVariable
ConditionVariable объекты расширяют класс Mutex. Используя переменные условия, можно приостановить выполнение в середине критической секции, пока ресурс не станет доступным.
Пример:
require 'thread'
mutex = Mutex.new
resource = 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)
{
RSTRUCT_SET(self, CONDVAR_WAITERS, ary_buf_new());
return self;
} Создает новый экземпляр переменной условия.
Публичные методы экземпляра
static VALUE
rb_condvar_broadcast(VALUE self)
{
wakeup_all_threads(GET_CONDVAR_WAITERS(self));
return self;
} Разбуживает все потоки, ожидающие этого блокировки.
static VALUE
rb_condvar_signal(VALUE self)
{
wakeup_first_thread(GET_CONDVAR_WAITERS(self));
return self;
} Разбуживает первый поток в очереди, ожидающий этой блокировки.
wait(mutex, timeout=nil) Показать исходный код
static VALUE
rb_condvar_wait(int argc, VALUE *argv, VALUE self)
{
VALUE waiters = GET_CONDVAR_WAITERS(self);
VALUE mutex, timeout;
struct sleep_call args;
rb_scan_args(argc, argv, "11", &mutex, &timeout);
args.mutex = mutex;
args.timeout = timeout;
rb_ary_push(waiters, rb_thread_current());
rb_ensure(do_sleep, (VALUE)&args, delete_current_thread, waiters);
return self;
} Освобождает блокировку, удерживаемую в mutex и ожидает; повторно приобретает блокировку при разбуживании.
Если timeout задано, этот метод возвращает результат после timeout секунд, даже если ни один другой поток не сигнализирует.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.