Warum leidet Code, der eine gemeinsam genutzte Variable über Threads verändert, scheinbar NICHT unter einer Race-Bedingung?

Bin ich mit Cygwin-GCC und diesen code ausführen:

#include <iostream>
#include <thread>
#include <vector>
using namespace std;

unsigned u = 0;

void foo()
{
    u++;
}

int main()
{
    vector<thread> threads;
    for(int i = 0; i < 1000; i++) {
        threads.push_back (thread (foo));
    }
    for (auto& t : threads) t.join();

    cout << u << endl;
    return 0;
}

Zusammengestellt, mit der Zeile: g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o.

Druckt es 1000, das ist richtig. Aber ich erwartete eine geringere Anzahl aufgrund des threads überschreiben eines bereits erhöhten Wert. Warum funktioniert dieser code nicht leiden, von den gegenseitigen Zugang?

Meiner test-Maschine hat 4 Kerne, und ich habe keine Beschränkungen auf das Programm, das ich kenne.

Das problem weiterhin besteht, wenn anstelle der Inhalt der freigegebenen foo mit etwas komplexeren, z.B.

if (u % 3 == 0) {
    u += 4;
} else {
    u -= 1;
}

InformationsquelleAutor der Frage mafu | 2017-01-23

Schreibe einen Kommentar