Multicore und Synchronisation

Warum genügt es in C nicht als Synchronisation, eine für den Austausch zwischen Threads verwendete Flag-Variable nur mit volatile zu versehen?

  1. AWeil mit volatile versehene Variablen von anderen Threads nicht mehr gelesen werden können
  2. BWeil volatile nur Compiler-Optimierungen unterdrückt und weder die Unteilbarkeit von Operationen noch die für andere Kerne sichtbare Reihenfolge garantiert
  3. CWeil eine mit volatile versehene Variable auf der Festplatte gespeichert wird und langsam ist
Antwort und Erläuterung anzeigen

Antwort: B. Weil volatile nur Compiler-Optimierungen unterdrückt und weder die Unteilbarkeit von Operationen noch die für andere Kerne sichtbare Reihenfolge garantiert

volatile weist den Compiler an, Lese- und Schreibzugriffe auf eine Variable weder wegzulassen noch zusammenzufassen, und war ursprünglich für den Zugriff auf Hardwareregister gedacht. Es verhindert nicht, dass die CPU die Reihenfolge von Speicheroperationen ändert, und macht auch Operationen wie counter++ nicht unteilbar. Ab C11 und C++11 garantieren _Atomic und std::atomic sowohl Unteilbarkeit als auch Speicherreihenfolge.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Warum lässt sich bei _Atomic in C11 und std::atomic in C++11 die Speicherreihenfolge (Memory Order) angeben?
  2. Welche Aussage im Vergleich von „grobkörnigem Sperren“, bei dem eine gesamte große Datenstruktur mit einer Sperre geschützt wird, und „feinkörnigem Sperren“, bei dem Teile mit getrennten Sperren geschützt werden, ist richtig?
  3. Welche Eigenschaft sperrfreier (lock-free) Algorithmen ist richtig?
  4. Welche Aussage zum kritischen Abschnitt (Critical Section) ist richtig?
  5. Welche Aussage zur in parallelen Programmen verwendeten Barrierensynchronisation ist richtig?

Vergleiche zu diesem Thema