ConditionVariable

ConditionVariable

ri

 ----------------------------------------------- Class: ConditionVariable
      ConditionVariable objects augment class Mutex. Using condition
      variables, it is possible to suspend while in the middle of a
      critical section until a resource becomes available.
 
      Example:
 
        require 'thread'
      
        mutex = Mutex.new
        resource = ConditionVariable.new
      
        a = Thread.new {
          mutex.synchronize {
            # Thread 'a' now needs the resource
            resource.wait(mutex)
            # 'a' can now have the resource
          }
        }
      
        b = Thread.new {
          mutex.synchronize {
            # Thread 'b' has finished using the resource
            resource.signal
          }
        }
 
 ------------------------------------------------------------------------
 
 
 Class methods:
 --------------
      new
 
 
 Instance methods:
 -----------------
      broadcast, signal, wait

refe

 ==== ConditionVariable ====
 執筆者募集
 
 
 
 スレッドの同期機構の一つである状態変数を実現するクラスConditionVariable オブジェクトスレッドが待ち合わせを行う条
 件をオブジェクト化したものです。
 
     mutex = Mutex.new
     cv = ConditionVariable.new
 
     Thread.start {
         mutex.synchronize {
           ...
           while (条件が満たされない)
             cv.wait(m)
           end
           ...
         }
     }
 あるスレッドで上のように条件が満たされるまで wait メソッドで
 スレッドを止めて、他のスレッドThread.start {
         mutex.synchronize {
           # 上の条件を満たすための操作
           cv.signal
         }
     }
 
 として、signal メソッドで wait を実行しているスレッドに対し
 て条件が成立したことを通知するのが典型的な使用例です。
 以下は 「Pthread プログラミング」にあった ConditionVariable 
 の例をRuby で書いてみた。なぜか最後にデッドロックする。
   require 'thread'
 
   count_lock = Mutex.new
   count_hit_threshold = ConditionVariable.new
   count = 0
   COUNT_THRESHOLD = 10
 
   inc_count = proc {
     loop {
       count_lock.synchronize {
           count  = 1
           p [Thread.current, count]
           if count >= COUNT_THRESHOLD
             count_hit_threshold.signal
             Thread.exit
           end
       }
     }
   }
 
   ths = []
   ths << Thread.new(