09.03.2014 Aufrufe

Konzepte und funktionaler Vergleich von Thread-Systemen

Konzepte und funktionaler Vergleich von Thread-Systemen

Konzepte und funktionaler Vergleich von Thread-Systemen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

2.2 Synchronisation<br />

Um die Abläufe <strong>und</strong> Zugriffe auf gemeinsame Daten <strong>von</strong> mehreren (quasi-)parallel ablaufenden<br />

<strong>Thread</strong>s koordinieren zu können, werden Möglichkeiten zur (Interthread-)Synchronisation benötigt.<br />

(Unabhängig da<strong>von</strong> gestatten viele <strong>Thread</strong>-Implementierungen die Benutzung eben dieser<br />

Mechanismen über Prozeßgrenzen hinweg. Hier sollen jedoch in erster Linie die prozeßlokalen<br />

Synchronisationsmittel behandelt werden.)<br />

Generell kann man feststellen, daß es zu jedem Synchronisationsobjekt ein Funktionspaar für dessen<br />

Initialisierung <strong>und</strong> Beendigung gibt. Das hat nichts mit der Speicherverwaltung dieser Objekte zu tun.<br />

Es gibt lediglich dem zugr<strong>und</strong>eliegenden <strong>Thread</strong>-System die Möglichkeit, diese Objekte in seine<br />

internen Datenstrukturen einzubinden <strong>und</strong> zu initialisieren bzw. daraus zu entfernen.<br />

2.2.1 Monitore<br />

Ein Monitor im Sinne <strong>von</strong> [Hoare 74] stellt ein Synchronisationsmittel für ein <strong>von</strong> mehreren <strong>Thread</strong>s<br />

verwendetes Datenobjekt dar. Ein Monitor besteht aus<br />

• dem zu schützenden Datenobjekt,<br />

• einem Mutex (mutual exclusion lock, einem Mittel zum wechselseitigen Ausschluß) <strong>und</strong><br />

• einer endlichen Anzahl <strong>von</strong> Bedingungsvariablen (condition variables).<br />

Mutexes<br />

In Tabelle 3 sind die verschiedenen Funktionen für Mutexes aufgeführt. Die <strong>Thread</strong>-Bibliothek<br />

garantiert dem Programmierer, daß zwischen den mit (a) <strong>und</strong> (b) gekennzeichneten Teiloperationen<br />

einer mutex_lock(m)-Operation <strong>von</strong> keinem anderen <strong>Thread</strong> ein mutex_lock(m) erfolgreich<br />

ausgeführt werden kann. Diese Forderung ist notwendig, damit nicht mehrere <strong>Thread</strong>s in den Besitz<br />

desselben Mutexes gelangen können.<br />

Name<br />

mutex_init()<br />

mutex_destroy()<br />

mutex_lock()<br />

mutex_unlock()<br />

Beschreibung<br />

Initialisiert den Mutex<br />

Beendet den Mutex<br />

Blockiert solange, bis der Mutex frei ist (a) <strong>und</strong> nimmt ihn dann in Besitz (b)<br />

Gibt den Mutex frei (nur der Besitzer kann das)<br />

Tabelle 3 Funktionen für Mutexes<br />

Implementationsunterschiede gibt es hier in der exakten Funktionsweise <strong>von</strong> mutex_lock() <strong>und</strong><br />

mutex_unlock(). Aufschluß über die Semantik liefert ein abermaliges Anfordern eines Mutexes<br />

durch seinen Besitzer ohne vorherige Freigabe. Es kann einer der folgenden drei Fälle eintreten:<br />

• Verklemmende Mutexes:<br />

Der <strong>Thread</strong> blockiert <strong>und</strong> kann nicht mehr fortgeführt werden, weil er auf die Freigabe des Mutex<br />

wartet, welche er jedoch nur selbst veranlassen könnte. (Zu Verklemmungen (deadlocks) allgemein<br />

siehe Abschnitt 3.2.5.)<br />

• Nicht-verklemmende, nicht-rekursive Mutexes:<br />

Die <strong>Thread</strong>-Bibliothek erkennt die drohende Verklemmung <strong>und</strong> liefert eine Fehlermeldung.<br />

• Rekursive Mutexes:<br />

Im Gegensatz zu beiden obigen Varianten wird bei dieser Variante keine Fehlermeldung<br />

zurückgegeben. Die Bibliothek zählt intern die Zahl der verschachtelten mutex_lock()-Aufrufe<br />

<strong>und</strong> gibt erst nach einer ebenso großen Anzahl <strong>von</strong> mutex_unlock()-Aufrufen den Mutex wieder<br />

frei. Es sei noch einmal betont, daß hier nur der Besitzer einen Mutex nochmals erhalten kann;<br />

Vergabe an einen anderen <strong>Thread</strong> würde das Prinzip des wechselseitigen Ausschlusses verletzen.<br />

Es lassen sich für alle drei Ansätze Szenarien finden, die ihre Existenz rechtfertigen. Jedoch werden in<br />

den meisten Fällen die rekursiven Mutexes die angenehmsten sein; der Programmierer kann<br />

problemlos <strong>und</strong> ohne weiteren Programmieraufwand aus einer mit einem Mutex geschützen Routine<br />

eine weitere, ebenfalls mit demselben Mutex geschützte Routine aufrufen.<br />

4

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!