std 映射访问元素,同时创建新的线程安全

std map access element while creating new one thread safety

如果我有map<int, Fruit> x。在一个线程上,我尝试读取一个元素 x[10].type 的数据,而在另一个线程上,我创建了一个新元素 Fruit &new_fruit = x[7]。这个线程安全吗?因为据我所知,只要不一样key/element就应该没问题。

您可能指的是迭代器失效,根据您的理解,只要您不是 reading/writing 来自不同线程的相同密钥,它就是安全的。

但是,线程安全不是那样工作的。除非明确保证(或证明),否则您必须假设这种对数据结构的访问是不安全的。我所说的“这种访问”是指 non-synchronized 非 const 从多个线程访问数据结构及其 meta-data。

如果您需要说服力,只需考虑几乎总是用于实现 std::map 的平衡二叉搜索树(例如 red-black 或 AVL 树)。当您插入一个元素(如 x[7] 可以做到的那样)时,它会 re-organize (或“旋转”)其他节点,并且还会更新计算的高度或节点中子节点的数量。

任何 non-trivial datastructure/container 不能保证数据竞争和线程安全 必须 被视为 thread-unsafe 并受到保护与外部关键部分。除非证明否则。小心。