Middle+
Կարող եք տալ մի օրինակ իրավիճակի, երբ տեղի է ունենում գործընթացների փոխադարձ փակման, որը նրանց ստիպում է հավերժ մնալ փակված?
sobes.tech AI
Պատասխան AI-ից
Համատեղ փակագիծ (deadlock) տեղի է ունենում, երբ երկու կամ ավելի գործընթացներ (կամ թելեր) միաժամանակ պահում են ռեսուրսներ և յուրաքանչյուրը սպասում է մյուսի ազատ արձակմանը: Նման դեպքում ոչ մեկը չի կարող շարունակել աշխատանքը:
Օրինակ՝
- Գործընթաց A ստանում է R1 ռեսուրսը:
- Գործընթաց B ստանում է R2 ռեսուրսը:
- Գործընթաց A փորձում է ստանալ R2 ռեսուրսը և բլոկվում է, սպասելով նրա ազատ արձակմանը:
- Գործընթաց B փորձում է ստանալ R1 ռեսուրսը և նույնպես բլոկվում է:
Երկուսն էլ սպասում են միմյանց, ինչը հանգեցնում է անսահման փակագծի:
C++-ի մուտքագրում՝ mutex-ներով:
#include <mutex>
#include <thread>
#include <iostream>
std::mutex mtx1, mtx2;
void thread1() {
std::lock_guard<std::mutex> lock1(mtx1);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock2(mtx2);
std::cout << "Թել 1 ձեռք է բերել երկու մուտքագրիչները\n";
}
void thread2() {
std::lock_guard<std::mutex> lock2(mtx2);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock1(mtx1);
std::cout << "Թել 2 ձեռք է բերել երկու մուտքագրիչները\n";
}
int main() {
std::thread t1(thread1);
std::thread t2(thread2);
t1.join();
t2.join();
return 0;
}
Այս օրինակով՝ եթե thread1-ը ձեռք է բերում mtx1-ը, իսկ thread2-ը՝ mtx2-ը, և երկուսն էլ սպասում են միմյանց, ապա առաջանում է deadlock։