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++;
- AWeil die CPU die Addition manchmal falsch berechnet
- BWeil counter++ in Lesen, Addieren und Schreiben zerfällt und bei Überlappung der Vorgänge zweier Threads eine der Additionen verloren geht
- 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.