class 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
源码
# 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