从两个线程调用 std::deque 上的擦除和 push_back 是否线程安全?
Is it thread-safe to call erase and push_back on std::deque from two threads?
这里有两个函数:
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
是线程安全的吗?行为是否未定义?
不,从两个线程在 std::deque<>
上调用 erase()
和 push_back()
不是线程安全的。
没有。这不安全。
erase()
和 push_back()
都不是 原子 操作。
您需要在线程之间同步访问 std::deque
。最简单的解决方案是 std::mutex
.
The execution of a program contains a data race if it contains two
conflicting actions in different threads, at least one of which is not
atomic, and neither happens before the other. Any such data race
results in undefined behavior.
erase
和 push_back
都不是原子的,所以你会有数据竞争。
"Effective C++ Digital Collection" 告诉我们,您对实现的所有希望是:
这里有两个函数:
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
是线程安全的吗?行为是否未定义?
不,从两个线程在 std::deque<>
上调用 erase()
和 push_back()
不是线程安全的。
没有。这不安全。
erase()
和 push_back()
都不是 原子 操作。
您需要在线程之间同步访问 std::deque
。最简单的解决方案是 std::mutex
.
The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.
erase
和 push_back
都不是原子的,所以你会有数据竞争。
"Effective C++ Digital Collection" 告诉我们,您对实现的所有希望是: