Sobes.tech
Middle+

Môžete uviesť príklad situácie, keď dôjde k vzájomnému blokovaniu procesov, čo spôsobí, že zostanú navždy zaseknuté?

sobes.tech AI

Odpoveď od AI

Vzájomná blokácia (deadlock) nastáva, keď dva alebo viac procesov (alebo vlákien) súčasne držia zdroje a každý z nich čaká na uvoľnenie zdroja, ktorý drží iný proces. V dôsledku toho nemôže žiadny z nich pokračovať.

Príklad:

  • Proces A získa zdroj R1.
  • Proces B získa zdroj R2.
  • Proces A sa pokúsi získať zdroj R2 a zablokuje sa, čakajúc na jeho uvoľnenie.
  • Proces B sa pokúsi získať zdroj R1 a tiež sa zablokuje.

Oba procesy čakajú na seba navzájom, čo vedie k nekonečnému zablokovaniu.

Príklad v C++ s mutexmi:

#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 << "Vlákno 1 získalo oba zámky\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 << "Vlákno 2 získalo oba zámky\n";
}

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

V tomto príklade môže dôjsť k deadlocku, ak vlákno 1 získa mtx1 a vlákno 2 mtx2, a obaja čakajú na uvoľnenie zdroja od druhého.