Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++: Multithreading

Reader/Writer Locks

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Reader-Writer Locks erlauben es seit C++14, lesende von schreibenden Threads zu unterscheiden. Damit wird der konkurrierende Zugriff auf die geteilten Variablen minimiert.
05:31

Transkript

In dieser Lektion möchte ich Ihnen die Reader-Writer Locks in C++ 14 genauer vorstellen. Ich fang diesen Fall gleich mit der Praxis an. Was ich die zentrale Idee von Reader-Writer Locks? Sie haben eine geschärte Variable, die Sie natürlich schützen müssen, wenn Threads gleichzeitig auch zugreifen. Wenn Sie es genauer überlegen, es ist durchaus zulässig, dass mehrere lesende Threads zur gleichen Zeit auf die Variable zugreifen, aber nur genau ein Schreibender maximal. Sie unterscheiden also den lesenden, den unkritischen, von dem schreibenden, den kritischen, Zugriff. Ich habe hier ein Beispiel konstruiert. Ich habe hier ein Telefonbook, das heißt der String Standart Map, damit werden Dijsktra, 1972, Skott, 1976 und Ritchie, 1983. Und was simuliere ich jetzt, den lesenden und den schreibenden Zugriff auf diese geteilte Variable. Lesend heißt, ich will was rauslesen. Schreibend heißt, ich will das Telefonbuch verändern. Dazu habe ich zwei Funktionen geschrieben. Add to Telephone Book, es macht das, was es beschreibt. Es fügt neue Werte zum Telefonbuch hinzu. Ich habe Telefonbuch hier, Telephone book, und ich füge neues String, respektiv einen Namen und die neue Telefonnummer, respektiv eine Nummer, hinzu. Dazu wählt es Kritisches, und da ich nur ein Thread gleichzeitig auf dieser kritischen Ressource arbeiten lassen darf, wende ich in lock_guard mein shared_guard_mutex. Entscheide ich hier – lock_guard. Der sichert zu, dass ich nur ein Thread gleichzeitig den Bereich von hier bis hier betreten darf. Hier schreibe ich dann Starting Update, damit Sie was an der Konsole sehen. Die Operation benötigt eine halbe Sekunde. An der Stelle hier wird tatsächlich unter dem Namen na den Telefonnummer tele eingetragen. Und hier sage ich, jetzt bin ich fertig. Das ist der exklusive Part, das ist der verändernde Part, den darf nur ein Thread zu einem Zeitpunkt maximal betreten. Und hier hat man denn Shared Lock System, ich habe nicht shared_lock, ich habe ein lock_guard. Die shared_lock verwendet shared_timed_mutex und das bedeutet, diesen Bereich hier dürfen beliebig viele lesende Threads gleichzeitig verwenden. Gut. Das war eine Funktion. Hier kommt Ablauf. Sie sehen, ich habe eine ganze Härte an Threads. Ich habe eins, zwei, drei, ah, hier, acht Reader und eins, zwei drei Writer Thread. Die Reader rufen die Printnummer Funktion auf, die Writer rufen die Add to Telephone Book Funktion auf und fügen was hinzu. Hier warte ich auf die Reader und die Writer. Und zum Schluss gebe ich hier das ganze Telefonbuch in einer XXX passierten Vorschleife aus. Ja, lass es mal laufen, das Programm. Es dauert ein bisschen, weshalb ich 2,5 Sekunden warte. Und Sie sehen: STARTING UPDATE; ENDING UPDATE. Das ist ein schreibender Thread. Das ist ein schreibender Thread. Und dann, ah, kommen hier lauter lesende Threads. Ich führe es noch mal aus, um zu zeigen, die Reihenfolge sollte sich ändern. Ja, Sie sehen, hier ist es ein bisschen anders. Hier sind Schreibender, drei Lesende und Schreibender, und noch mal vier Lesende Threads. Ach ja, ein da oben hier. Vergessen. Gut. Und hier sehen Sie das endgültige Telefonbuch. Ich muss ehrlich sein, das Programm hier ist undefiniert. Warum? Machen Sie doch eine kleine Pause und überlegen sich, wieso das Programm undefiniert ist. Hier habe ich Ihnen keinen Hinweis gegeben. Das Problem ist, wenn Sie einTelefonbuch nach einem Wert na fragen, dann wird der Wert in dem Telefonbuch noch nicht existiert, automatisch der Wert angelegt, und als Queue die Zahl Null angelegt, der gefolgt wird vom int-Wert. Das ist natürlich extrem bösartig in dieser Situation. Weil Sie eine Leseoperation machen, unter der Decke passiert aber umständlich die Schreibeoperation. Das heißt, nun kann es tatsächlich einen kritischen Wertlauf geben und das Schreiben hier, und das Schreiben hier. Und damit ist das Programm undefiniert. Es gibt den Data ways, den kritischen Wertlauf und alles kann passieren. Daher sollten Sie erst mit Find prüfen, ob der Entry da ist. Und dann eben der Logik weiterfahren. Das Verhalten haben alle assoziativen Container in C++, die den Index-Operator hier unterstützen. Das ist map, multi map, analog map und analog security map. In dieser Lektion habe ich Ihnen die Reader-Writer Locks anhand eines Beispiels genau vorgestellt. Um Reader-Writer Locks anwenden zu können, benötigen Sie ein Compiler, der C++ 14 unterstützt.

C++: Multithreading

Lernen Sie die High-Level Threading-Schnittstelle in C++ kennenb und nutzen, die Sie in Form von Threads, Tasks, Locks und Bedingungsvariablen zur Anwendung bringen.

2 Std. 40 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:16.08.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!