Назад к вопросамЧто может случиться, если два потока одновременно вызовут
JuniorТеорияЧасто
Что может случиться, если два потока одновременно вызовут lock_both(a, b) и lock_both(b, a)?
#include <mutex>
std::mutex a;
std::mutex b;
void lock_both(std::mutex& first, std::mutex& second) {
std::lock_guard<std::mutex> g1(first);
std::lock_guard<std::mutex> g2(second);
}Возможна взаимная блокировка: каждый захватит первый мьютекс и будет вечно ждать второй
- Ждать, что потоки выполнятся по очереди: если каждый держит свой первый мьютекс, второго не получит никто, и ни один
lock_guardне уничтожится. - Ждать взаимной блокировки при каждом запуске: она случается, только если оба потока захватят первые мьютексы раньше, чем кто-то из них — второй. А это зависит от случайного порядка выполнения.
- Как
std::scoped_lockзахватывает два мьютекса без этого риска? - Почему такая программа может пройти все тесты и всё равно зависнуть позже?