我在std::map< StudentName, Marks >
哪里和StudentName
std::string
Marks
is 一个整数。
现在,在我的应用程序中,多个线程正在访问此映射以:
- 找到
StudentName
。如果存在,增加它的Marks
. - 的减少
Marks
。StudentName
- 添加
StudentName
到地图。 StudentName
从地图中删除。
问题:std::map
在多线程环境中执行上述操作的最有效方法是什么?
当前解决方案:
在地图上执行所有这些操作的代码放在临界区中。但这会降低性能。
(例如,如果一个线程正在为特定学生添加分数,为什么其他要为不同学生添加分数的线程需要等待?)
这是我认为可以做到的:
我从 SO 上的其他类似问题/答案中收集了关于地图上多线程的信息,这就是我认为我需要做的。提供std::map
不是线程安全的,(即更新时没有其他线程应该访问映射)
- 我只想将最后两个(添加/删除 StudentName)活动排他性(在向地图添加/删除元素时不应并行执行其他活动)
- 不允许多个线程访问同一个 map 元素(这样多个线程不能同时尝试增加/减少同一个学生的分数)
但我不确定如何实现这一点(可以使用哪些线程同步对象/技术)我正在通过 VS2010 在 Windows 上开发此应用程序
请问这里有什么建议或替代方法吗?
更新: 感谢大家的意见。不幸的是,VS2010 中没有可用的原子整数。所以,这就是我计划根据你的意见做的事情。我将拥有三种锁: 在地图上:map_read_lock、map_write_lock 在元素上:element_write_lock(对于每个元素)
现在,
在地图中查找元素时:获取 map_read_lock (这将允许我同时查找)
向地图添加/删除元素时:获取map_write_lock (这将防止容器的并发更新,我认为不推荐)
更改值时:Get (map_read_lock & element_write_lock) (这将允许并行更改不同的值,但会阻止同时更改相同的值。此外,将防止在更新容器时更改值,反之亦然)