Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从两个线程调用erase并在std::deque上推回_是线程安全的吗?_C++_Multithreading_Stl_Deque - Fatal编程技术网

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
no
push_back
都不是原子的,因此您将面临数据竞争

<>“有效C++数字集合”告诉我们,从一个实现中你可以得到的所有希望是:


不,这不是线程安全的,因为这两个操作都不是原子操作。请评论而不是回答?更好的是,找到重复的。。。