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:
-
Vienmēr bloķējiet mutexus tajā pašā secībā. Tas ir vienkāršākais un biežāk izmantotais veids, kā izvairīties no deadlock.
-
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.