У меня есть std :: map, который я использую для сопоставления значений (идентификаторов полей) с удобочитаемой строкой. Эта карта инициализируется один раз, когда моя программа запускается до запуска любых других потоков, и после этого она никогда не изменяется снова. Прямо сейчас я даю каждому потоку свою копию этой (довольно большой) карты, но это явно неэффективное использование памяти и замедляет запуск программы. Поэтому я думал дать каждому потоку указатель на карту, но это поднимает проблему безопасности потока.
Если все, что я делаю, это чтение с карты, используя следующий код:
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 = "";
}
Будет ли это работать или есть проблемы с чтением std :: map из нескольких потоков?
Примечание. В настоящее время я работаю с Visual Studio 2008, но мне бы хотелось, чтобы это работало в большинстве основных реализаций STL.
Обновление: отредактированный пример кода для правильности констант.