Почему 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
мьютекс.