从两个线程调用std :: deque上的erase和push_back是否可以线程安全?

时间:2018-02-04 07:26:36

标签: c++ multithreading stl deque

这是两个功能:

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是否可以线程安全?行为未定义吗?

3 个答案:

答案 0 :(得分:3)

  

如果程序包含两个,则程序的执行包含数据竞争   不同线程中的冲突行为,其中至少有一个不是   原子,既不会发生在另一个之前。任何这样的数据竞争   导致未定义的行为。

erase没有push_back都不是原子的,因此您将进行数据竞争。

&#34;有效的C ++数字馆藏&#34;告诉我们,您可以从实施中获得所有希望:

enter image description here

答案 1 :(得分:2)

不,从两个线程调用erase()上的push_back()std::deque<>是不可线程安全的。

答案 2 :(得分:0)

没有。这不安全。

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

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