Junior — Middle
როგორ შეიძლება უზრუნველყოს ორი mutex-ის ატომური ბლოკირება ურთიერთბლოკვის თავიდან ასაცილებლად?
sobes.tech AI
პასუხი AI-სგან
ორ mutex-ების ატომური ჩაკეტვის დროს, ურთიერთდაკეტვის (deadlock) თავიდან ასაცილებლად, შეიძლება გამოიყენოთ შემდეგი მიდგომები:
-
ყოველთვის ჩაკეტეთ mutex-ები ერთსა და იმავე წესით. ეს ყველაზე მარტივი და გავრცელებული მეთოდია deadlock-ების თავიდან ასაცილებლად.
-
გამოიყენეთ 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-ებზე.