Sobes.tech
Junior — Middle

როგორ შეიძლება უზრუნველყოს ორი mutex-ის ატომური ბლოკირება ურთიერთბლოკვის თავიდან ასაცილებლად?

sobes.tech AI

პასუხი AI-სგან

ორ mutex-ების ატომური ჩაკეტვის დროს, ურთიერთდაკეტვის (deadlock) თავიდან ასაცილებლად, შეიძლება გამოიყენოთ შემდეგი მიდგომები:

  1. ყოველთვის ჩაკეტეთ mutex-ები ერთსა და იმავე წესით. ეს ყველაზე მარტივი და გავრცელებული მეთოდია deadlock-ების თავიდან ასაცილებლად.

  2. გამოიყენეთ std::lock (C++11 და ზევით). ეს ფუნქცია ერთდროულად ჩაკეტავს რამდენიმე mutex-ს და უზრუნველყოფს deadlock-ის არარსებობას.

მაგალითი std::lock-თან:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // ატომურად ჩაკეტავს ორივე mutex-ს
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // კრიტიკული სექცია
}

აქ std::lock ჩაკეტავს ორივე mutex-ს, ხოლო std::lock_guard-ი, std::adopt_lock ბეჭდვით, მიიღებს კონტროლს უკვე ჩაკეტილ mutex-ებზე.