这是两个功能:
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); }
从两个不同的线程调用foo
和bar
是否可以线程安全?行为未定义吗?
答案 0 :(得分:3)
如果程序包含两个,则程序的执行包含数据竞争 不同线程中的冲突行为,其中至少有一个不是 原子,既不会发生在另一个之前。任何这样的数据竞争 导致未定义的行为。
erase
没有push_back
都不是原子的,因此您将进行数据竞争。
&#34;有效的C ++数字馆藏&#34;告诉我们,您可以从实施中获得所有希望:
答案 1 :(得分:2)
不,从两个线程调用erase()
上的push_back()
和std::deque<>
是不可线程安全的。
答案 2 :(得分:0)
没有。这不安全。
erase()
和push_back()
都不是原子操作。
您需要在线程之间同步对std::deque
的访问权限。最简单的解决方案是std::mutex
。