Sobes.tech
Junior — Middle

Hogyan biztosítható két mutex atomáris zárolása a holtpontok elkerülése érdekében?

sobes.tech MI

Válasz az MI-től

Két mutex atomikus zárolásakor a kölcsönös zárolás (deadlock) elkerülése érdekében a következő megközelítéseket lehet alkalmazni:

  1. Mindig ugyanabban a sorrendben zárolja a mutexeket. Ez a legegyszerűbb és legelterjedtebb módszer a deadlock elkerülésére.

  2. Használja az std::lock (C++11 és felette). Ez a függvény egyszerre zárol több mutexet, garantálva a deadlock hiányát.

Példa az std::lock használatával:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // atomikusan zárolja mindkét mutexet
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // kritikus szekció
}

Ebben az esetben az std::lock zárolja mindkét mutexet, és az std::lock_guard a std::adopt_lock zászlóval átveszi az irányítást a már zárolt mutexek felett.