Sobes.tech
Junior — Middle

Kā nodrošināt divu mutexu atomu bloķēšanu, lai novērstu savstarpējas bloķēšanas?

sobes.tech AI

Atbilde no AI

Lai novērstu savstarpēju bloķēšanu (deadlock) atomiski bloķējot divus mutexus, var izmantot šādus pieejas:

  1. Vienmēr bloķējiet mutexus tajā pašā secībā. Tas ir vienkāršākais un biežāk izmantotais veids, kā izvairīties no deadlock.

  2. Izmantojiet std::lock (no C++11 un jaunākas versijas). Šī funkcija bloķē vairākus mutexus vienlaikus, nodrošinot deadlock neesamību.

Piemērs ar std::lock:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // atomiski bloķē abus mutexus
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // kritiskā sadaļa
}

Šeit std::lock bloķē abus mutexus, un std::lock_guard ar std::adopt_lock karogu pārņem jau bloķēto mutexu kontroli.