前田です。

In message "[ruby-list:6815] Re: Mutex/ConditionVariable/Queue"
senda / ic.rdc.ricoh.co.jp <senda / ic.rdc.ricoh.co.jp> wrote:

|eval.c の thread_run()をみればわかりますが、
|とりあえず、
|
|  def signal
|    @waiters_mutex.synchronize {
|      t = @waiters.shift
|      if t then
|	Thread.critital = TRUE
|	t.run
|	Thread.critital = FALSE
|    }
|  end
|
|とすることでその場のschedulingを回避できるようです。

いや、他のスレッドに条件を変更されないためには、ここはスケジューリング
イベントを起こさないといけないんです。
mutex(@waiters_mutexでなく、リソースを保護するmutex)が解放されてからでは
Mutexのキューに優先度を付けても意味がないですから。
# そういう意味で効率を犠牲にして安全側に倒したと書きました。

-- 
前田 修吾