Thread-Sicherheit beim Schreiben eines std :: vector vs plain Arrays

Ich habe gelesenauf Stackoverflow DasKeiner der STL-Container ist threadsicher zum Schreiben. Aber was heißt das konkret? Bedeutet das, dass ich beschreibbare Daten in einfachen Arrays speichern sollte?

Ich erwarte gleichzeitige Anrufe anstd::vector::push_back(element) Dies kann zu inkonsistenten Datenstrukturen führen, da die Größe des Vektors geändert werden kann. Aber was ist mit einem Fall wie diesem, bei dem die Größenänderung nicht beteiligt ist:

1) Verwenden eines Arrays:

int data[n];
// initialize values here...

#pragma omp parallel for
for (int i = 0; i < n; ++i) {
    data[i] += func(i);
}

2) Verwenden eines `std :: vector``:

std::vector<int> data;
data.resize(n);
// initialize values here...

#pragma omp parallel for
for (int i = 0; i < n; ++i) {
    data[i] += func(i);
}

Ist die erste Implementierung wirklich besser als die zweite a) in Bezug auf die Threadsicherheit und b) in Bezug auf die Leistung? Ich würde lieber einen std :: vector verwenden, da ich mit Arrays im C-Stil weniger vertraut bin.

EDIT: Ich entfernte ein#pragma omp atomic update Schreibschutz.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage