以下代码线程是否安全:
THREAD A
std::vector<std::string> myCopy;
with_locked_mutex(m) {
myCopy = sharedCopy;
}
myCopy.clear() etc. // -- a
THREAD B
while(1) {
// do things ...
with_locked_mutex(m) {
sharedCopy.push_back(a); // -- b
}
}
换句话说,std :: vector的COW语义(以及std :: string的语义)是否会在a和b之间创建竞争条件?如果是这样,我能做些什么来阻止它吗?
答案 0 :(得分:3)
假设with_locked_mutex(m) { something }
以某种方式确保在代码块之前获取互斥锁并在之后释放,这两个操作将以互斥方式运行,因此不会出现问题。
无论如何std::vector
都不能使用写时复制。
答案 1 :(得分:2)
AFAIK,std::vector
没有COW语义。赋值运算符和复制构造函数总是复制每个元素。