Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Speichermodell

std::atomic_flag

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
std::atomic_flag ist der einfachste aller atomaren Datentypen. Er ist der einzige atomare Datentyp in C++, der garantiert lock-frei ist.
04:23

Transkript

In dieser Lektion möchte ich Ihnen den einfachsten aller atomaren Datentypen in C++ vorstellen: der sogenannte "std: :atomic_flag". Der "std: :atomic_flag" bietet eigentlich extrem wenig an. Es hat ein ganz schmales Interface. Es hat nur die Methoden "clear" und "test and set". Mit "clear" können Sie es zurücksetzen, sozusagen auf "false" setzten, mit "test and set" können Sie es setzen. Gleichzeitig bekommen Sie den alten Wert zurück. Wieso ist das "std: :atomic_flag" so wichtig? Es ist die einzige lockfreie Datenstruktur in C++. Das heißt, alle weiteren atomaren Datentypen in C++ bauen auf dem "std: :atomic_flag" auf, das heißt aber auch, allen weiteren atomaren Datentypen in C++ können intern einen Lock verwenden. Nur "std: :atomic_flag" sichert zu, dass es kein Lock verwendet. In der Regel wird’s zwar so sein, dass auf allen Plattformen alle weiteren atomaren Datentypen, die Sie haben für Zeiger, für integrale Datentypen, für Wahrheitswerte, dass alle weiteren atomaren Datentypen auch lockfrei sind. Sie haben auch nicht Zusicherung. Obwohl "std: :atomic_flag" so ein einfaches Interface besitzt, reicht es bereits aus, in Spinlock zu implementieren. In Spinlock, ist ähnlich wie in Mutex, eine Variable, die hilft einen kritischen Bereich zu schützen, indem Sie am Anfang des kritischen Bereichs "Lock" aufrufen und am Ende "Unlock" aufrufen. Der große Unterschied zwischen einer Spinlock und einer Mutex ist aber, dass das Spinlock ein sogenanntes "busy waiting" macht und ein Mutex kurzzeitig immer wiedermal schläft. Das heißt, ein Spinlock versucht, den kritischen Bereich zu bekommen, indem es die ganze CPU beansprucht. Das zeige ich Ihnen im Beispiel. Hier links, habe ich einen Spinlock implementiert. Intern verwende ich sensierten "atomic flag". Im Constructor des Spinlocks setzte ich das 'Atomic Flag' auf "INIT", ich initialisiere sozusagen. Und hier habe ich die zwei Methoden: "lock" und "unlock", die mir helfen den kritischen Bereich zu schützen. Was passiert jetzt? Wenn ich Lock aufrufe, passiert, dass im ersten Durchlauf das Flag noch nicht gesetzt ist, dann wird’s gesetzt, gibt also immer als Wert "true" zurück und damit bin ich hier in der Endlosschleife gefangen. Ich bin so lange gefangen, bis "flag.clear" das Flag wieder auf "false" setzt. Wie wende ich das Ganze an? Wir schauen mal hier. Ich habe hier zwei Threads: "thread t" und "thread t2". Beide führen das gleiche Arbeitspaket 'workOnResource' aus. Was macht workOnResource? Es zieht kurzzeitig das Spinlock, schläft für zwei Sekunden und gibt’s wieder frei. Und das Ganze führe ich jetzt mit einer Spinlock aus. Den habe ich hier drüben implementiert und mit einem klassischen Mutex. Und jetzt sehen Sie den feinen Unterschied. Wenn ich’s mit einer Spinlock ausführe, sehen Sie ganz deutlich, dass für zwei Sekunden immer die CPU-Last auf 100 % geht. Das heißt, die CPU wird voll in Anspruch genommen. Sie sehen auch, dass immer verschiedene CPUs zum Zuge kommen. Hier, schwarz bedeutet die CPU 3, blau bedeutet CPU 1. Und jetzt sehen Sie auch den Unterschied zum Mutex. Der feine Unterschied zwischen Mutex und Spinlock ist der, dass der Mutex zwar versucht den Lock für den kritischen Bereich zu bekommen, aber wenn er ihn nicht bekommt, legt er sich wieder, für eine kurze Zeit, zum Schlafen. Das macht eben der Spinlock nicht, der wartet, indem er die CPU die ganze Zeit in Anspruch nimmt. In dieser Lektion habe ich Ihnen "std: :atomic_flag" vorgestellt. "std: :atomic_flag" ist die einzige atomare Variable in C++, die keinen Lock benötigt, die also lockfrei ist. Alle weiteren atomaren Variablen in C++ sind nicht lockfrei, sie können also einen Lock verwenden. Und das Besondere an diesen weiteren atomaren Variablen für Zeiger, für Ganzzahlen, für eigene Datentypen ist, dass sie intern einen "atomic_flag" verwenden.

C++: Speichermodell

Verstehen und nutzen Sie die Konzepte und die zugrundeliegenden TEchnolgien des Speichermodells in C++.

1 Std. 29 min (29 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.11.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!