Junior — Middle
Ikki mutexni atomik tarzda bloklashni qanday ta'minlash mumkin, o'zaro blokirovkalarni oldini olish uchun?
sobes.tech AI
AIdan javob
Mutaxislarni atomik tarzda bloklashda o'zaro bloklanish (deadlock) oldini olish uchun quyidagi yondashuvlardan foydalanish mumkin:
-
Har doim mutexlarni bir xil tartibda bloklang. Bu deadlocklardan qochishning eng oddiy va keng tarqalgan usuli.
-
std::lock (C++11 va yuqori versiyalar) dan foydalaning. Bu funksiya bir nechta mutexlarni bir vaqtning o'zida bloklaydi va deadlockning oldini oladi.
std::lock bilan misol:
#include <mutex>
std::mutex m1, m2;
void func() {
std::lock(m1, m2); // ikkala mutexni atomik tarzda bloklaydi
std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
// kritik bo'lim
}
Bu yerda std::lock ikkala mutexni ham bloklaydi, va std::lock_guard std::adopt_lock bayrog'i bilan allaqachon bloklangan mutexlar ustidan nazoratni oladi.