Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

Atomare Befehle


Wie Sie im letzten Kapitel erfahren haben, können selbst solch triviale Vorgänge wie das Erhöhen eines Zahlenwertes in Multithreadingumgebungen zu einem Problem werden. Es gibt zahlreiche Möglichkeiten, wie man dem entgegenwirken kann, Atomare Befehle (Atomic Operations) sind nur eine davon.

Per Definition sind Atomare Befehle Vorgänge, die nicht vom Betriebssystem unterbrochen werden, bevor sie nicht vollständig abgeschlossen wurde. Wie aber sieht das in der Praxis aus?

i++;

Was im Programmcode ein einzelne Befehl ist, sind eigentlich drei Operationen. Wert holen, Wert erhöhen und Wert speichern. Zu verhindern, dass diese Operationen vom Betriebssystem unterbrochen werden, liegt Augenscheinlich nicht in der Macht des Programmierers. Und dennoch gib es ist eine ganz einfache Lösung.

System.Threading.Interlocked.Increment ( ref i );

Die Klasse Interlocked im Namespace System.Threading sorgt dafür, dass die Operationen nicht unterbrochen werden und macht aus dem Erhöhen des Wertes einen atomaren Befehl. Die Variable i wird dabei als Referenzwert übergeben.

Ausser Increment gibt es noch drei weitere Funktionen in dieser Klasse.

Decrement, zum verringern eines Wertes. Entspricht i--;
Exchange, für das Vertauschen von zwei Werten oder Objekten.
CompareExchange, vergleicht zwei Werte und ersetzt einen Wert, wenn die ursprünglichen Werte identisch sind.

Natürlich ist die Interlocked Klasse in ihren Möglichkeiten stark eingeschränkt und komplexe Vorgänge lassen sich nur auf anderem Wege synchronisieren. Das einfache Hochzählen von Werten kann aber dank Interlock sicher und problemlos ausgeführt werden.