【问题标题】:Is it thread-safe to call erase and push_back on std::deque from two threads? [duplicate]从两个线程调用 std::deque 上的擦除和 push_back 是否是线程安全的? [复制]
【发布时间】:2018-07-14 07:38:06
【问题描述】:

这里有两个函数:

std::deque<int> q;

// Push lots of elements to q
xxxxx

void foo() {
  auto begin = q.cbegin();
  auto end = q.cend();
  q.erase(begin, end);
}
void bar(int x) { q.push_back(x); }

从两个不同的线程调用foobar 是线程安全的吗?行为是否未定义?

【问题讨论】:

  • 不,它不是线程安全的,因为这些操作都不是原子

标签: c++ multithreading stl deque


【解决方案1】:

如果一个程序的执行包含两个 不同线程中的冲突操作,至少其中一个不是 原子的,两者都不会先于另一个发生。任何此类数据竞赛 导致未定义的行为。

erasepush_back 都不是原子的,所以你会遇到数据竞争。

“Effective C++ Digital Collection”告诉我们,您对实现的期望是:

【讨论】:

    【解决方案2】:

    不,从两个线程调用std::deque&lt;&gt; 上的erase()push_back() 不是线程安全的。

    【讨论】:

    • 评论而不是回答?
    • 更好的是,找到骗子......
    【解决方案3】:

    没有。这是不安全的。

    erase()push_back() 都不是原子操作。

    您需要在线程之间同步对std::deque 的访问。最简单的解决方案是std::mutex

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2017-04-21
      • 2014-05-23
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      相关资源
      最近更新 更多