Sono consapevole del fatto che i contenitori della libreria standard non sono thread-safe. Con ciò pensavo che un contenitore, ad esempio di tipo std::list
, non fosse accessibile da più di un thread contemporaneamente (alcuni dei quali potrebbero modificare il contenitore). Ma ora sembra che ci sia più di quello che incontra l'occhio; qualcosa di più sottile, qualcosa di non così ovvio, almeno per me.contenitori standard come variabili locali nell'applicazione multi-thread
Ad esempio, si consideri questa funzione che accetta il primo argomento per valore:
void log(std::string msg, severity s, /*...*/)
{
return; //no code!
}
È questo thread-safe?
In un primo momento, sembra che sia thread-safe, in quanto il corpo della funzione non accede alle risorse modificate , quindi thread-safe. A pensarci bene, mi viene da pensare che quando si invoca una funzione di questo tipo, verrà creato un oggetto di tipo std::string
, che è il primo argomento, e penso che la costruzione di questo oggetto non sia thread-safe, poiché utilizza internamente std::allocator
, che credo non sia sicuro per i thread. Quindi invocare una tale funzione non è sicuro per i thread. Ma se è corretto, allora che ne pensi:
void f()
{
std::string msg = "message"; //is it thread-safe? it doesn't seem so!
}
Sto andando giusto? È possibile utilizzare std::string
(o qualsiasi contenitore che utilizza internamente std::allocator
) nel programma a più thread?
Sto specificatamente parlando di contenitori come variabili locali, al contrario di oggetti condivisi.
Ho cercato su Google e ho trovato molti dubbi simili, senza una risposta concreta. Affronto problema simile come il suo:
Si prega di considerare C++ 03 e C++ 11, entrambe le cose.
Nawaz: sai di quale implementazione del C++ si tratta qui: http://www.sgi.com/tech/stl/Allocators.html Si afferma che l'allocatore predefinito è thread-safe. – Sid
@ Sid: non è una libreria standard; supportano molte cose che stdlib non ha. – Nawaz
Ok, mi dispiace per la distrazione. – Sid