我有一个 std::map 用于将值(字段 ID)映射到人类可读的字符串。当我的程序在任何其他线程启动之前启动时,这个映射被初始化一次,之后它就再也不会被修改了。现在,我给每个线程自己的这个(相当大的)映射副本,但这显然是对内存的低效使用,并且会减慢程序启动速度。所以我想给每个线程一个指向映射的指针,但这会引发线程安全问题。
如果我所做的只是使用以下代码从地图中读取:
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 正确性编辑了代码示例。