Почему Helgrind жалуется на эту программу?

У меня есть такой класс:

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);

Разве это не потокобезопасно? Валгринд говорит, что возможна гонка данных. Я подозреваю, что сначала вызывается swap, прежде чем блокировка proc переключается на поток #1, и он изменяет a, затем переключается на # 2 и меняет содержимое. Но не должно быть проблем, поскольку на самом деле указатель передается подкачке, так что даже после изменения из #1 поток подкачки должен увидеть это изменение. Трудно ли это увидеть Вальгринду?

1 ответ

Решение

Нет, это не потокобезопасно. Проблема в том, что хотя A::swap блокирует мьютекс, который принадлежит this, он не блокирует мьютекс, который принадлежит аргументу aТаким образом, один поток может быть изменение a в то время как другой поток обменивается с a, Вам нужно будет добавить lock вызывать swap закрывать aмьютекс.

Другие вопросы по тегам