Вместо:
std::lock(m1, m2);
используйте:
std::lock(lock1, lock2);
Более подробную информацию (включая пример) можно найти на странице справки для std::lock
.
Почему ваш код зависает?
Когда вы вызываете std::lock(m1, m2)
, два мьютекса блокируются напрямую. Ни один из std::unique_lock
s (lock1
и lock2
) не знает об этом, и поэтому они не могут разблокировать мьютексы.
Таким образом, когда func1
заканчивается, оба мьютекса все еще заблокированы, иfunc2
не может проходить после строки std::lock(m1, m2)
.
Почему работает фиксированный код?
При вызове std::lock(lock1, lock2)
, std::unique_lock
s (lock1
и * 1030)*) знают об этом - теперь они владеют замками и несут ответственность за их разблокировку (что происходит, когда они выходят из области видимости).
Итак, когда func1
заканчивается, оба мьютекса разблокируются, и func2
может проходить мимо линии std::lock(lock1, lock2)
. И все хорошо.