Ho letto on Stackoverflow che nessuno dei contenitori STL è thread-safe per scrivere. Ma cosa significa in pratica? Significa che dovrei archiviare dati scrivibili in semplici array?Filo-sicurezza di scrittura di un array std :: vector vs plain
Mi aspetto che le chiamate simultanee a std::vector::push_back(element)
possano portare a strutture di dati incoerenti perché potrebbero comportare il ridimensionamento del vettore. Ma che dire di un caso come questo, in cui non è coinvolto il ridimensionamento:
1) utilizzando una matrice:
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2) utilizzando un `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);
}
La prima implementazione è davvero migliore della seconda a) in termini di sicurezza dei thread eb) in termini di prestazioni? Preferirei usare un vettore std ::, dal momento che mi sento meno a mio agio con gli array in stile C.
MODIFICA: Ho rimosso un #pragma omp atomic update
proteggendo la scrittura.
Non sono abbastanza sicuro da dargli una risposta, ma sono abbastanza sicuro che scrivere in elementi diversi di un 'std :: vector' è sicuro per i thread. – Angew
Questi due snippet sono ugualmente thread-safe. –
"Ma cosa significa in pratica?" : Significa che un contenitore deve essere bloccato esclusivamente per scrivere * e * leggere se una qualsiasi operazione/coincide con una ** scrittura ** concorrente. Puoi far sbattere tutti i lettori su un contenitore che desideri, ma non appena viene introdotto un potenziale * di scrittura, tutte le scommesse sono disattivate e devi bloccare l'accesso * all * (non solo gli altri autori). Un blocco a lettura singola e multipla funziona bene per questo, btw. – WhozCraig