Spec-Zone.ru › Ruby 3.4

класс Monitor

Родитель:
Объект

Используйте класс Monitor, когда вам нужен объект блокировки для блоков с взаимным исключением.

require 'monitor'

lock = Monitor.new
lock.synchronize do
  # exclusive access
end

Методы открытого экземпляра

enter → nil
Исходный код
static VALUE
monitor_enter(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    if (!mc_owner_p(mc)) {
        rb_mutex_lock(mc->mutex);
        RB_OBJ_WRITE(monitor, &mc->owner, rb_fiber_current());
        mc->count = 0;
    }
    mc->count++;
    return Qnil;
}

Входит в секцию исключения.

Также известен как: mon_enter
exit → nil
Исходный код
static VALUE
monitor_exit(VALUE monitor)
{
    monitor_check_owner(monitor);

    struct rb_monitor *mc = monitor_ptr(monitor);

    if (mc->count <= 0) rb_bug("monitor_exit: count:%d", (int)mc->count);
    mc->count--;

    if (mc->count == 0) {
        RB_OBJ_WRITE(monitor, &mc->owner, Qnil);
        rb_mutex_unlock(mc->mutex);
    }
    return Qnil;
}

Выходит из секции исключения.

Также известен как: mon_exit
mon_enter
Псевдоним для: enter
mon_exit
Псевдоним для: exit
mon_synchronize
Псевдоним для: synchronize
mon_try_enter
Псевдоним для: try_enter
new_cond ()
Исходный код
# File ext/monitor/lib/monitor.rb, line 263
def new_cond
  ::MonitorMixin::ConditionVariable.new(self)
end

Создает новую переменную MonitorMixin::ConditionVariable, связанную с объектом Monitor.

synchronize { } → результат блока
Исходный код
static VALUE
monitor_synchronize(VALUE monitor)
{
    monitor_enter(monitor);
    return rb_ensure(monitor_sync_body, monitor, monitor_sync_ensure, monitor);
}

Входит в секцию исключения и выполняет блок. Выходит из секции исключения автоматически при завершении блока. См. пример в MonitorMixin.

Также известен как: mon_synchronize
try_enter → true или false
Исходный код
static VALUE
monitor_try_enter(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);

    if (!mc_owner_p(mc)) {
        if (!rb_mutex_trylock(mc->mutex)) {
            return Qfalse;
        }
        RB_OBJ_WRITE(monitor, &mc->owner, rb_fiber_current());
        mc->count = 0;
    }
    mc->count += 1;
    return Qtrue;
}

Попытка войти в секцию исключения. Возвращает false в случае неудачи.

Также известен как: try_mon_enter, mon_try_enter
try_mon_enter
Псевдоним для: try_enter

Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API