класс Monitor
Используйте класс Monitor, если вам нужен объект-блокировка для блоков с взаимным исключением.
require 'monitor' lock = Monitor.new lock.synchronize do # exclusive access end
Открытые методы экземпляра
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
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
Псевдоним для: synchronize
Псевдоним для: try_enter
# File ext/monitor/lib/monitor.rb, line 263 def new_cond ::MonitorMixin::ConditionVariable.new(self) end
Создает новый объект MonitorMixin::ConditionVariable, связанный с объектом Monitor.
static VALUE
monitor_synchronize(VALUE monitor)
{
monitor_enter(monitor);
return rb_ensure(monitor_sync_body, monitor, monitor_sync_ensure, monitor);
} Входит в эксклюзивную секцию и выполняет блок. При завершении блока автоматически выходит из эксклюзивной секции. См. пример в разделе MonitorMixin.
Также имеет псевдоним: mon_synchronize
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_enter
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.