У меня есть 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.
Обновление: отредактированный пример кода для корректности const.