c++ - std::map 的高效线程同步技术

标签 c++ multithreading dictionary std stdmap

我有std::map< StudentName, Marks >哪里StudentNamestd::stringMarks是一个整数。

现在,在我的应用程序中,多个线程正在访问此映射:

  1. 查找 StudentName 。如果存在,增加其Marks .
  2. 减少MarksStudentName .
  3. 添加StudentName到 map 。
  4. 删除StudentName从 map 上看。

问题:std::map 上执行上述操作的最有效方法是什么?在多线程环境中?

当前解决方案: 在 map 上执行所有这些操作的代码都放在临界区中。但这会降低性能。
(例如,如果一个线程正在为特定学生添加分数,为什么其他想要为不同学生添加分数的线程需要等待?)

这是我认为可以做到的:
我从其他类似的问题/答案中收集了有关 map 上多线程的信息,这就是我认为我需要做的。提供std::map不是线程安全的,(即更新时没有其他线程应该访问 map )

  1. 我只想将最后两项(添加/删除 StudentName)事件排除在外(在 map 中添加/删除元素时不应并行执行其他事件)
  2. 不允许多个线程访问映射的同一元素(以便多个线程无法尝试同时增加/减少同一学生的分数)

但我不确定如何实现这一点(可以使用哪些线程同步对象/技术)我正在通过 VS2010 在 Windows 上开发此应用程序

请问这里有什么建议或替代方法吗?

更新: 感谢大家的意见。不幸的是 VS2010 中没有可用的原子整数。因此,这就是我根据您的意见计划做的事情。我将拥有三种锁: 在 map 上:map_read_lock、map_write_lock 在元素上:element_write_lock (对于每个元素)

现在,

在 map 中查找元素时:获取map_read_lock(这将允许我并发查找)

向 map 添加/删除元素时:获取map_write_lock(这将阻止容器的并发更新,我认为不建议这样做)

更改值时:Get (map_read_lock & element_write_lock) (这将允许并行更改不同的值,但会阻止同时更改同一值。此外,将防止在更新容器时更改值,反之亦然)反之亦然)

最佳答案

当一个线程增加标记时会发生什么 学生A,另一个线程删除学生A?你需要 即使只是修改标记,也会锁定 map 。或者你 需要更复杂的事务管理(这可能不是 对于这样一个简单的情况来说是合理的)。

或者,您可以在 map 上使用 rwlock,并使用独占 锁定 map 中的每个元素。要修改标记,您需要 映射上的读锁和元素上的排他锁;到 添加或删除学生时,您会在 map 上获取写锁。但 这需要大量的额外资源。

关于c++ - std::map 的高效线程同步技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18530754/

相关文章:

c++ - 又一个逻辑

c++ - 无法从其他类获取单例类的实例

c++ - 在基类的构造函数中正确初始化 unique_ptr

C++:如何运行系统命令 N 次(异步)并获得 N 次执行时间?

c++ - 派生类与基类的 std::shared_ptr 的使用

python - fork 后正在运行的线程会发生什么情况?

java - 避免在 CyclicBarrier 上耍花招的想法

c++ - 在 C++ 中将字符串和列表添加到映射

dictionary - Elm:如何合并两个字典?

python - 将 SeqIO 字典写入 Fasta 文件