Sobes.tech
Junior — Middle

Как да осигурим атомарно блокиране на два мьютекса, за да предотвратим взаимни блокировки?

sobes.tech AI

Отговор от AI

За да се предотврати взаимното блокиране (deadlock) при атомарното блокиране на два mutex, могат да се използват следните подходи:

  1. Винаги блокирайте mutex-ите в един и същи ред. Това е най-простият и разпространен начин за избягване на deadlock.

  2. Използвайте std::lock (от C++11 нагоре). Тази функция блокира няколко mutex-а едновременно, гарантирайки липсата на deadlock.

Пример с std::lock:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // блокира и двата mutex-а атомарно
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // критична секция
}

Тук std::lock блокира и двата mutex-а, а std::lock_guard с флаг std::adopt_lock поема контрола върху вече блокираните mutex-и.