2015-06-30 16 views
10

Sto leggendo sulla sicurezza filo di vari contenitori STL da questo link Ora mi sono imbattuto in questo punto in cui si afferma per C++ 11 soloC++ 11/C++ 03 e std :: vector filo di sicurezza

elementi diversi nello stesso contenitore possono essere modificati contemporaneamente da fili diversi, ad esclusione degli elementi di std::vector<bool> (per esempio, un vettore di std::future oggetti può essere ricevere valori di da più thread)

significa se ho un metodo come quello che viene utilizzato da più thread contemporaneamente (notice the method does not have any locks)

void ChangeValue(int index , int value) 
{ 
    someVector[index] = value; 
} 

è sicuro il metodo di cui sopra. La mia comprensione è che è sicuro solo per C++ 11. Tuttavia quando guardo l'altra dichiarazione di cui al link

Tutte le funzioni membro const può essere chiamato contemporaneamente da diversi discussioni sullo stesso contenitore. Inoltre, le funzioni membro begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range (), a(), e, eccetto nei contenitori associativi , operatore [], si comportano come cost ai fini di sicurezza thread (ovvero, possono anche essere chiamati contemporaneamente da thread diversi sullo stesso contenitore). Più in generale, le funzioni di libreria standard di C++ non modificano gli oggetti a meno che tali oggetti non siano accessibili, direttamente o indirettamente, tramite gli argomenti non costanti della funzione, incluso il puntatore this, con .

Sono giunto alla conclusione che in C++ 03 il metodo di cui sopra può essere tranquillamente utilizzato. Gentilmente fammi sapere se la mia comprensione è corretta.

+5

Non ha senso chiedersi se qualcosa è sicuro per i thread in C++ 03 - C++ 03 e in precedenza non aveva alcun concetto di thread o sicurezza dei thread. –

+1

'ChangeValue' è thread-safe (come definito da C++ 11 e versioni successive) a condizione che due thread non passino lo stesso argomento per' index', altrimenti le chiamate che passano lo stesso argomento sono sincronizzate l'una con l'altra in qualche modo esterne alla funzione. –

+0

Grazie per averlo eliminato Igor. Potresti metterlo come risposta – MistyD

risposta

8

Non ha senso chiedersi se qualcosa è sicuro per i thread secondo lo standard C++ 03 - C++ 03 e precedenti non avevano alcun concetto di thread o sicurezza dei thread.

ChangeValue è data-corsa libera (come definito da C++ 11 e successive) finchè nessun due fili passano stesso argomento per index, oppure chiamate superato lo stesso argomento sono sincronizzati tra loro da alcuni mezzi esterni alla funzione.