如果不同的线程始终使用不同的键,它们是否可以插入到映射中

Can different threads insert into a map if they always use different keys?

本文关键字:是否 映射 插入 线程 如果不      更新时间:2023-10-16

我正在尝试为对象设计一个消息队列。有一组 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操作,因此无法在不同步的情况下从多个线程并发执行此操作。