相关疑难解决方法(0)

std :: map的线程安全性,用于只读操作

我有一个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 = "";
}
Run Code Online (Sandbox Code Playgroud)

这是否有效或者从多个线程读取std :: map有问题吗?

注意:我目前正在使用visual studio 2008,但我希望这可以在大多数主要的STL实现中使用acros.

更新:已编辑的代码示例,用于const正确性.

c++ multithreading stl stdmap thread-safety

18
推荐指数
2
解决办法
2万
查看次数

为什么map在C++中不是多线程安全的?

当我试图解决代码中的并发问题时遇到了这个问题.在原始代码中,我们只使用一个唯一的锁来锁定作为stl映射的缓存的写操作.但是对缓存的读操作没有限制.所以我想在读操作中添加一个共享锁,并保持对写操作的唯一锁.但是有人告诉我,由于它本身就存在一些内部缓存问题,在地图上进行多线程处理是不安全的.

有人可以详细解释原因吗?内部缓存有什么作用?

c++ multithreading map

1
推荐指数
1
解决办法
837
查看次数

标签 统计

c++ ×2

multithreading ×2

map ×1

stdmap ×1

stl ×1

thread-safety ×1