next up previous contents index
Search Next: Monitore Up: Koordination von Threads Previous: Semaphore und die Klasse   Contents   Index


ConditionVariable

Beim Koordinieren von Threads allein mit Mutex-Objekten wird es problematisch, wenn ein Thread im gesperrten Bereich eine Ressource benötigt, die von einem anderen Thread gerade exklusiv benutzt wird. Für diese Situation sind Instanzen der Klasse ConditionVariable gedacht, die es einem Thread ermöglicht, zeitweilig auf die Kontrolle des Mutex-Objekts zu verzichten und nichts zu tun, sich beim Freiwerden der Ressource aber sofort wieder der Sperre des Mutex-Objekts zu bemächtigen.

Im folgenden Beispiel schreiben beide Threads auf die Standardausgabe, wobei der Zugriff mit der ConditionVariable logger geregelt wird. Mit wait gibt der erste Thread die Sperre im Mutex-Objekt frei, so dass der zweite Thread aktiv werden kann. Dieser wiederum weckt den ersten Thread mit signal auf und erhält nach dessen mutex-Freigabe die Kontrolle zurück.

require 'thread'

mutex = Mutex.new
logger = ConditionVariable.new

thread1 = Thread.new {
  mutex.synchronize {
    print 1
    logger.wait(mutex)
    print 3
  }
}

thread2 = Thread.new {
  mutex.synchronize {
    print 2
    logger.signal
    print 4
  }
}

thread1.join; thread2.join    #-> 1234



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20