In Files

  • thread.rb

Parent

Class/Module Index [+]

Quicksearch

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
  }
}

Public Class Methods

new() click to toggle source

Creates a new ConditionVariable

 
               # File thread.rb, line 187
def initialize
  @waiters = []
end
            

Public Instance Methods

broadcast() click to toggle source

Wakes up all threads waiting for this lock.

 
               # File thread.rb, line 220
def broadcast
  waiters0 = nil
  Thread.exclusive do
    waiters0 = @waiters.dup
    @waiters.clear
  end
  for t in waiters0
    begin
      t.run
    rescue ThreadError
    end
  end
end
            
signal() click to toggle source

Wakes up the first thread in line waiting for this lock.

 
               # File thread.rb, line 208
def signal
  begin
    t = @waiters.shift
    t.run if t
  rescue ThreadError
    retry
  end
end
            
wait(mutex) click to toggle source

Releases the lock held in mutex and waits; reacquires the lock on wakeup.

 
               # File thread.rb, line 194
def wait(mutex)
  begin
    mutex.exclusive_unlock do
      @waiters.push(Thread.current)
      Thread.stop
    end
  ensure
    mutex.lock
  end
end