std :: map从多个线程写入/读取

Mar*_*ard 8 c++ c++11

我希望能够从多个线程读取和写入std :: map.有没有办法在没有互斥量的情况下做到这一点(可能使用std :: atomic)?

如果没有,在C++ 11中最简单的方法是什么?

Ton*_*roy 7

如果std::atomic<>,你可以从任意线程修改和读取它们,但你需要以某种方式保存它们的地址 - 指针,引用或迭代器 - 你需要知道没有其他线程会调用erase它们...... .

尽管如此,即使原子值也不会使修改容器(例如插入或擦除元素)变得安全,而其他线程也在进行修改,查找或迭代.即使是" const"功能-样size(),empty(),begin(),end(),count(),和迭代器运动-是不安全的,因为突变操作可以在重新布线的节点间链路或更新相同的数据的中间.

对于上述以外的任何内容,您需要一个互斥锁.


举一个具体的例子,假设你已经插入了一个带std::string密钥的节点"client_counter"- 你可以启动一个线程来获取该元素的迭代器并对该计数器进行原子更新,而其他线程可以find从该元素读取但不得erase对其进行读取.您仍然可以map使用其他更新程序和读取器插入其他节点,而不与client_counter-updating线程进行任何额外同步.