【问题标题】: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); }
从两个不同的线程调用foo 和bar 是线程安全的吗?行为是否未定义?
【问题讨论】:
标签:
c++
multithreading
stl
deque
【解决方案1】:
如果一个程序的执行包含两个
不同线程中的冲突操作,至少其中一个不是
原子的,两者都不会先于另一个发生。任何此类数据竞赛
导致未定义的行为。
erase 和 push_back 都不是原子的,所以你会遇到数据竞争。
“Effective C++ Digital Collection”告诉我们,您对实现的期望是:
【解决方案2】:
不,从两个线程调用std::deque<> 上的erase() 和push_back() 不是线程安全的。
【解决方案3】:
没有。这是不安全的。
erase() 和 push_back() 都不是原子操作。
您需要在线程之间同步对std::deque 的访问。最简单的解决方案是std::mutex。