我有这样一个班级:
class A
{
public:
void swap(A& a)
{
lock(mutex_);
vec_.swap(a.vec_);
}
void push(int elem)
{
lock(mutex_);
vec_.push_back(elem);
}
private:
std::vector<int> vec_;
Mutex mutex_; // doesn't matter what kind of mutex is
};
A a, b;
主题#1:
a.push_back(5);
线程#2:
b.swap(a);
它不是线程安全吗? Valgrind表示可能存在数据竞争。我怀疑的是,在锁定proc切换到线程#1并且它修改a之前调用第一个swap,然后切换到#2并交换内容。但是应该没有问题,因为实际上指针被传递给交换,因此即使从#1线程交换修改后应该看到该更改。对于valgrind来说难以看到吗?
答案 0 :(得分:2)
不,这不是线程安全的。问题是,尽管A::swap
锁定属于this
的互斥锁,但它不会锁定属于参数a
的互斥锁,因此一个线程可以修改a
另一个线程与a
进行交换。您需要在lock
中添加swap
来锁定a
的互斥锁。