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