类 Monitor
当您需要为具有互斥的代码块创建锁对象时,请使用 Monitor
类。
require 'monitor' lock = Monitor.new lock.synchronize do # exclusive access end
公共实例方法
enter() 点击切换源代码
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() 点击切换源代码
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_check_owner() 点击切换源代码
static VALUE monitor_check_owner(VALUE monitor) { struct rb_monitor *mc = monitor_ptr(monitor); if (!mc_owner_p(mc)) { rb_raise(rb_eThreadError, "current fiber not owner"); } return Qnil; }
mon_locked?() 点击切换源代码
static VALUE monitor_locked_p(VALUE monitor) { struct rb_monitor *mc = monitor_ptr(monitor); return rb_mutex_locked_p(mc->mutex); }
mon_owned?() 点击切换源代码
static VALUE monitor_owned_p(VALUE monitor) { struct rb_monitor *mc = monitor_ptr(monitor); return (rb_mutex_locked_p(mc->mutex) && mc_owner_p(mc)) ? Qtrue : Qfalse; }
new_cond() 点击切换源代码
# File ext/monitor/lib/monitor.rb, line 257 def new_cond ::MonitorMixin::ConditionVariable.new(self) end
synchronize() 点击切换源代码
static VALUE monitor_synchronize(VALUE monitor) { monitor_enter(monitor); return rb_ensure(monitor_sync_body, monitor, monitor_sync_ensure, monitor); }
try_enter() 点击切换源代码
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; }
wait_for_cond(p1, p2) 点击切换源代码
static VALUE monitor_wait_for_cond(VALUE monitor, VALUE cond, VALUE timeout) { VALUE count = monitor_exit_for_cond(monitor); struct wait_for_cond_data data = { monitor, cond, timeout, count, }; return rb_ensure(monitor_wait_for_cond_body, (VALUE)&data, monitor_enter_for_cond, (VALUE)&data); }