Sobes.tech
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:

  1. Har doim mutexlarni bir xil tartibda bloklang. Bu deadlocklardan qochishning eng oddiy va keng tarqalgan usuli.

  2. 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.