Sobes.tech
Middle+

Ar galite pateikti pavyzdį situacijos, kai įvyksta tarpusavio blokavimas, kuris juos amžinai įstrigo?

sobes.tech AI

Atsakymas iš AI

Tarpusavio blokas (deadlock) įvyksta, kai du ar daugiau procesų (arba sriegių) tuo pačiu metu laiko išteklius ir kiekvienas jų laukia, kol kitas atlaisvins išteklių. Dėl to nė vienas jų negali tęsti darbo.

Pavyzdys:

  • Procesas A įgyja R1 išteklių.
  • Procesas B įgyja R2 išteklių.
  • Procesas A bando įgyti R2 išteklių ir užstringa, laukdamas, kol jis bus atlaisvintas.
  • Procesas B bando įgyti R1 išteklių ir taip pat užstringa.

Abu procesai laukia vienas kito, kas sukelia begalinį užstringimą.

C++ pavyzdys su mutex'ais:

#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 << "Gijas 1 įgijo abu užraktus\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 << "Gijas 2 įgijo abu užraktus\n";
}

int main() {
    std::thread t1(thread1);
    std::thread t2(thread2);
    t1.join();
    t2.join();
    return 0;
}

Šiame pavyzdyje gali įvykti deadlock, jei gija1 įgyja mtx1, o gija2 įgyja mtx2, ir abu laukia, kol kitas atlaisvins išteklius.