class 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() 点击切换源代码

创建一个与 Monitor 对象关联的新的 MonitorMixin::ConditionVariable

# File monitor/lib/monitor.rb, line 263
def new_cond
  ::MonitorMixin::ConditionVariable.new(self)
end
synchronize { } → 代码块的结果 点击切换源代码

进入独占区并执行代码块。当代码块退出时自动离开独占区。请参阅 MonitorMixin 下的示例。

static VALUE
monitor_synchronize(VALUE monitor)
{
    monitor_enter(monitor);
    return rb_ensure(monitor_sync_body, monitor, monitor_sync_ensure, monitor);
}
try_enter → true 或 false 点击切换源代码

尝试进入独占区。如果锁定失败,则返回 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;
}
try_mon_enter()

为了兼容性

别名:try_enter