Ho una std :: map che uso per mappare i valori (ID campo) su una stringa leggibile dall'uomo. Questa mappa viene inizializzata una volta quando il mio programma inizia prima che vengano avviati altri thread, dopodiché non viene mai più modificato. In questo momento, do a ogni thread la propria copia di questa (piuttosto grande) mappa ma questo è ovviamente un uso inefficiente della memoria e rallenta l'avvio del programma. Quindi stavo pensando di dare ad ogni thread un puntatore alla mappa, ma questo solleva un problema di sicurezza del thread.Sicurezza filo di std :: map per operazioni di sola lettura
Se tutto quello che sto facendo è la lettura dalla mappa utilizzando il seguente codice:
std::string name;
//here N is the field id for which I want the human readable name
unsigned field_id = N;
std::map<unsigned,std::string>::const_iterator map_it;
// fields_p is a const std::map<unsigned, std::string>* to the map concerned.
// multiple threads will share this.
map_it = fields_p->find(field_id);
if (map_it != fields_p->end())
{
name = map_it->second;
}
else
{
name = "";
}
Sarà questo lavoro o ci sono problemi con la lettura di uno std :: map da più thread?
Nota: Attualmente sto lavorando con Visual Studio 2008, ma mi piacerebbe che funzionasse con le principali implementazioni STL.
Aggiornamento: esempio di codice modificato per la correttezza const.
Nota: La risposta è limitata alla implemenation SGI STL. L'OP non ha menzionato quale è utilizzato. – foraidt
Vero, modifico per aggiungere queste informazioni. – laura
Uso l'implementazione fornita con Visual Studio 2008, ma stavo cercando una risposta che riguardasse la std :: map in generale, o almeno attraverso la maggior parte delle implementazioni, se possibile. –