Sobes.tech
Middle+

Puteți oferi un exemplu de situație în care are loc o blocare mutuală a proceselor, care le face să rămână blocate pentru totdeauna?

sobes.tech AI

Răspuns de la AI

Blocarea mutuală (deadlock) apare atunci când două sau mai multe procese (sau fire de execuție) dețin simultan resurse și fiecare așteaptă ca celălalt să elibereze o resursă. Ca rezultat, niciunul nu poate continua.

Exemplu:

  • Procesul A obține resursa R1.
  • Procesul B obține resursa R2.
  • Procesul A încearcă să obțină resursa R2 și se blochează, așteptând eliberarea acesteia.
  • Procesul B încearcă să obțină resursa R1 și, de asemenea, se blochează.

Ambele procese așteaptă unul pe celălalt, ceea ce duce la un deadlock infinit.

Exemplu în C++ cu mutex-uri:

#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 << "Thread 1 a obținut ambele lock-uri\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 << "Thread 2 a obținut ambele lock-uri\n";
}

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

În acest exemplu, poate apărea un deadlock dacă thread1 obține mtx1 și thread2 obține mtx2, iar amândoi așteaptă ca celălalt să elibereze resursa.