C++ 从两个线程调用erase并在std::deque上推回_是线程安全的吗?
这里有两个函数:C++ 从两个线程调用erase并在std::deque上推回_是线程安全的吗?,c++,multithreading,stl,deque,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); } std::deque q; //将大量元素推送到q xxxxx void foo(){ 自动开始=q.cb
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); }
std::deque q;
//将大量元素推送到q
xxxxx
void foo(){
自动开始=q.cbegin();
自动结束=q.cend();
q、 擦除(开始、结束);
}
空条(intx){q.push_back(x);}
从两个不同的线程调用
foo
和bar
是否线程安全?行为是否未定义?否,从两个线程调用std::deque
上的erase()
和push_back()
是线程安全的。否。这是不安全的
erase()
和push_-back()
都不是原子操作
您需要在线程之间同步对std::deque
的访问。最简单的解决方案是std::mutex
程序的执行包含一个数据竞争,如果它包含两个
不同线程中的冲突操作,至少有一个线程不冲突
原子的,两者都不发生在另一个之前。任何这样的数据竞赛
导致未定义的行为
erase
nopush_back
都不是原子的,因此您将面临数据竞争
<>“有效C++数字集合”告诉我们,从一个实现中你可以得到的所有希望是:
不,这不是线程安全的,因为这两个操作都不是原子操作。请评论而不是回答?更好的是,找到重复的。。。