我有一个 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 正确性。
只要您的地图保持不变,这将在多个线程中工作。您使用的地图实际上是不可变的,因此任何查找实际上都会在不会更改的地图中进行查找。
这是一个相关链接:http://www.sgi.com/tech/stl/thread_safety.html http://www.sgi.com/tech/stl/thread_safety.html
STL的SGI实现是
线程安全仅在以下意义上
同时访问不同的
容器是安全的,并且同时
对共享容器的读访问
是安全的。如果多个线程访问一个
单个容器,并且至少一个
线程可能会写,然后
用户有责任确保
线程之间的互斥
在容器访问期间。
您属于“对共享容器的同时读取访问”类别。
注意:这对于 SGI 实现来说是正确的。您需要检查是否使用其他实现。据我所知,在这两种似乎被广泛用作替代方案的实现中,STLPort 具有内置的线程安全性。不过我不知道 Apache 的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)