【问题标题】:C++ std::map - thread safe if one thread writes and another reads with always different keys? [duplicate]C++ std::map - 如果一个线程写入而另一个线程使用总是不同的键读取,则线程安全? [复制]
【发布时间】:2016-01-28 12:59:25
【问题描述】:

线程 A 使用键 C 写入 std::map

线程 B 使用键 D 从 std::map 读取

如果总是保证键不重叠,这个线程安全吗?

由于 std::map 在内部使用树结构,我可以想象在它被变异时可能会出现读取问题。

如果 std::map 不起作用,std::unordered_map 会更好吗?

【问题讨论】:

  • 密钥是否存在?
  • 。如果你有一个作家和一个读者,你需要某种同步。

标签: c++ multithreading thread-safety stdmap


【解决方案1】:
  • 如果你写的意思是改变一个已经存在的值 与键 C 关联的条目,那么答案是(我相信)YES
  • 如果您写的意思是(可能)插入新元素(或删除它们),那么答案肯定是NO

虽然不是权威来源,www.cplusplus.com 通常都有一个关于每个函数的潜在数据竞争的部分。

【讨论】:

  • 第一部分取决于地图中的内容。如果值是指针并且DC 都具有相同的指针,那么您可以在阅读时进行写入。
  • @NathanOliver 严格来说,那么您将在两个线程中阅读地图。更改指针映射中的值会使元素指向其他地方。
  • @user2079303 我说的是改变指针指向的值。如果值是指针,并且一个线程更改了指针指向的值,而另一个线程同时读取它,那么您的读取和 UB 被撕裂。
  • @NathanOliver 我知道你在说什么,我不反对。我的观点是它与问题或这个答案不太相关。
  • @user2079303 为什么。如果这是 OP 所拥有的,那么他会认为这没关系。一揽子“是”不应该是答案,而是“视情况而定”
最近更新 更多