Multicore und Synchronisation

Wird der obige Code gleichzeitig in zwei Threads ausgeführt, kann der Endwert von counter kleiner als 200000 sein. Welcher Grund ist richtig?

int counter = 0;
// 2つのスレッドが同時に、それぞれ
for (int i = 0; i < 100000; i++)
    counter++;
  1. AWeil die CPU die Addition manchmal falsch berechnet
  2. BWeil counter++ in Lesen, Addieren und Schreiben zerfällt und bei Überlappung der Vorgänge zweier Threads eine der Additionen verloren geht
  3. CWeil die Schleifendurchläufe pro Thread automatisch halbiert werden
Antwort und Erläuterung anzeigen

Antwort: B. Weil counter++ in Lesen, Addieren und Schreiben zerfällt und bei Überlappung der Vorgänge zweier Threads eine der Additionen verloren geht

counter++ besteht aus drei Operationen: den Wert aus dem Speicher lesen, 1 addieren und in den Speicher zurückschreiben. Liest Thread A den Wert 100 und liest Thread B ebenfalls 100, bevor A zurückgeschrieben hat, schreiben beide 101, und aus zwei Additionen wird eine. Dies ist ein typisches Beispiel eines Data Race. Mit einem atomaren Additionsbefehl oder einer Sperre, sodass jeweils nur ein Thread aktualisiert, ergibt sich korrekt 200000.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Welche Aussage zu atomaren Befehlen (unteilbaren Befehlen) ist richtig?
  2. Wie arbeitet der atomare Befehl CAS (Compare-and-Swap)?
  3. Der obige Code verdoppelt die gemeinsame Variable counter mit CAS(&p, erwarteter Wert, neuer Wert). Wann schlägt CAS fehl und die Schleife wird wiederholt?
  4. Wann schlägt bei einem Befehlspaar wie LR/SC (Load-Reserved/Store-Conditional) von RISC-V das SC (Store-Conditional) fehl?
  5. Welche Aussage zum ABA-Problem, das bei sperrfreien Datenstrukturen mit CAS auftritt, ist richtig?

Vergleiche zu diesem Thema