【问题标题】:threadsafety vs Iterator validity线程安全与迭代器有效性
【发布时间】:2017-04-15 08:04:23
【问题描述】:

我有两个线程:

  • 线程A插入std::map
  • 线程 B 从std::map 中删除

由于std::map::erasestd::map::insert 使映射的所有迭代器都有效,我似乎不明白在这种情况下会发生争用情况。

【问题讨论】:

  • 地图的内部状态可能会在同时执行两个调用时变得混乱。 size 浮现在脑海中。
  • 既然最新 c++ 标准中只要求 const 函数是线程安全的,而 std::map 不需要是线程安全的,为什么在调用 non-const 时不会出现竞争条件功能?

标签: c++ multithreading iterator race-condition stdmap


【解决方案1】:

评论说的是对的。我会将它们与您的陈述结合起来:

std::map::erasestd::map::insert 保持映射的所有迭代器有效,仅当它们按顺序执行时。

如果它们并行执行,一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象的操作结果是未定义的。这就是问题的根源。

如果您使用mutex 同步访问您的对象,一切都会正常工作。容器没有内置同步,因为这会显着减慢它们的工作,而这只是有时需要。

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 2019-08-20
    • 2014-12-12
    • 1970-01-01
    • 2014-03-18
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多