如果不同的线程始终使用不同的键,它们是否可以插入到映射中
Can different threads insert into a map if they always use different keys?
我正在尝试为对象设计一个消息队列。有一组 X 线程都可以向此对象发送消息(稍后处理)。如果我有一个std::map<thread_id_t, message>
,假设线程 1 只添加键为 1、线程 2 到键 2 的消息,等等,这个线程是否安全?
std::map
对于多个同时编写器不是线程安全的。
STL 映射不是线程安全的众多原因之一是,STL 映射的基础实现是一个 AVL 树,在多次插入后,每隔一段时间需要重新平衡一次。重新平衡映射会影响多个节点,并且绝对不是线程安全的。
请参考 Dr. Dobb 关于无锁数据结构的优秀文章,如果您对此有任何兴趣。
标准C++库中类的一般规则是:如果在对象上调用非const
方法(某些方法除外,如 std::vector<T>::operator[]()
),则不能让任何其他线程以任何方式同时访问此对象。如果您需要使用操作,则需要以某种方式同步不同线程之间的访问。标准中的相关条款是17.6.4.10 [res.on.objects]第1款:
如果从不同线程调用标准库函数可能 引入数据竞赛。17.6.5.9中规定了可能发生这种情况的条件。
。和 17.6.5.9 [res.on.data.races],它描述了标准C++库不允许执行 mutate 对象,除非在它们上调用非const
成员函数。
由于将对象插入std::map<...>
显然是非const
操作,因此无法在不同步的情况下从多个线程并发执行此操作。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 在映射中插入一对时,C++是否需要额外的代码
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 由并发无序映射查找线程调用的函数是否安全?
- 如何检查映射值中是否存在元素
- 将大型对象存储在无序映射中是否效率低下
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 是否可以访问非线程安全容器内指针指向的值(线程安全映射中的条目)?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?
- Rust 在索引时是否隐式创建映射条目,例如C++
- 多重映射的每个元素是否同时包含键和值
- 有效地检查映射 c++ 中是否存在元素
- 来自并发哈希映射的迭代器是否安全
- 如果可能,标准::映射分配是否静态
- 检查是否存在多维映射的元素的最快方法是什么
- Winapi:是否需要在可执行内存映射的文件上调用FlushInstructionCache
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 使用原子指令确保映射访问安全,是否可以使用两个不同的原子对指令进行重新排序
- 是否有活动目录属性的完整列表,以及与LDAP的映射
- 内存模块是否映射到进程的虚拟空间?