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тердин көзөмөлүн алат.