为什么helgrind抱怨这个程序?

时间:2016-01-26 21:14:39

标签: c++ multithreading thread-safety valgrind

我有这样一个班级:

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来说难以看到吗?

1 个答案:

答案 0 :(得分:2)

不,这不是线程安全的。问题是,尽管A::swap锁定属于this的互斥锁,但它不会锁定属于参数a的互斥锁,因此一个线程可以修改a另一个线程与a进行交换。您需要在lock中添加swap来锁定a的互斥锁。