Sobes.tech
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։