Junior — Middle
119
Как можно обеспечить атомарное блокирование двух мьютексов для предотвращения взаимных блокировок?
AI-дан жауап
sobes.tech AI
Для предотвращения взаимных блокировок (deadlock) при блокировании двух мьютексов атомарно, можно использовать следующие подходы:
-
Всегда блокировать мьютексы в одном и том же порядке. Это самый простой и распространённый способ избежать взаимных блокировок.
-
Использовать std::lock (C++11 и выше). Эта функция блокирует несколько мьютексов одновременно, гарантируя отсутствие deadlock.
Пример с std::lock:
#include <mutex>
std::mutex m1, m2;
void func() {
std::lock(m1, m2); // блокируем оба мьютекса атомарно
std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
// критическая секция
}
Здесь std::lock блокирует оба мьютекса, а std::lock_guard с флагом std::adopt_lock берёт на себя управление уже заблокированными мьютексами.