Sobes.tech
Junior — Middle

İki mutexin atomik kilidlənməsini necə təmin etmək və qarşılıqlı bloklamaları qarşısını almaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

İki mutexin atomik şəkildə kilidlenməsi zamanı qarşılıqlı kilidlənmənin (deadlock) qarşısını almaq üçün aşağıdakı yanaşmalardan istifadə etmək mümkündür:

  1. Həmişə mutexləri eyni ardıcıllıqla kilidləyin. Bu, deadlock-lərdən qaçınmanın ən sadə və yaygın yoludur.

  2. std::lock (C++11 və yuxarı) istifadə edin. Bu funksiya bir neçə mutexi eyni zamanda kilidləyir və deadlock-un qarşısını alır.

std::lock nümunəsi:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // hər iki mutexi atomik şəkildə kilidləyir
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // kritik bölmə
}

Burada std::lock hər iki mutexi kilidləyir, və std::lock_guard std::adopt_lock bayrağı ilə artıq kilidlənmiş mutexlərin idarəsini götürür.