【问题标题】:What are the implications of calling vector::size / map::size in a non-thread-safe manner?以非线程安全的方式调用 vector::size / map::size 的含义是什么?
【发布时间】:2021-05-16 06:43:27
【问题描述】:

据我所知,map::sizevector::size,而 const 不能保证线程安全。我发现vector 的一种实现如下所示:

size_type size() const _NOEXCEPT
        {return static_cast<size_type>(this->__end_ - this->__begin_);}

如果我以非线程安全的方式调用此方法,会出现什么问题?只是返回的结果可能已经过时了几毫秒,或者它可能会破坏其他线程修改集合的尝试或以其他方式冒严重问题的风险?

【问题讨论】:

  • 线程安全(不幸的是)与返回值有点过时无关。
  • @largest_prime_is_463035818 这取决于。

标签: c++ multithreading stl


【解决方案1】:

如果我以非线程安全的方式调用此方法,会出现什么问题?

如果向量在没有同步的情况下在另一个线程中被修改,那么程序的行为将是未定义的。任何事情都有可能发生。

【讨论】:

    【解决方案2】:

    会出什么问题? 向向量中添加元素可能会导致重新分配并使所有迭代器无效。如果在您对beginend 的查询之间发生了重新分配,那么它们的区别将是无稽之谈。

    【讨论】:

    • 是的,指针更新也不能保证是原子的,即使我们reserve 足以从不进行重新分配,UB 仍然有潜力。只是一个可能出错的具体示例来帮助想象 UB 会是什么样子(size 返回疯狂的数字)。但是 UB 是未定义的,如果计算机长出一条腿并踢你的胫骨,这仍然是这段代码的有效行为。
    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多