Sobes.tech
Middle+

Vai jūs varat sniegt piemēru situācijai, kad notiek savstarpēja bloķēšana, kas viņus padara mūžīgi iestrēgušus?

sobes.tech AI

Atbilde no AI

Savstarpēja bloķēšana (deadlock) notiek, kad divi vai vairāki procesi (vai pavedieni) vienlaikus tur kopīgas resursus, un katrs no tiem gaida, kad otrs atbrīvos resursu. Rezultātā neviens no viņiem nevar turpināt darbu.

Piemērs:

  • Process A iegūst R1 resursu.
  • Process B iegūst R2 resursu.
  • Process A mēģina iegūt R2 resursu un tiek bloķēts, gaidot tā atbrīvošanu.
  • Process B mēģina iegūt R1 resursu un arī tiek bloķēts.

Abi procesi gaida viens otru, kas noved pie bezgalīgas bloķēšanas.

C++ piemērs ar mutexiem:

#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 << "Vītnes 1 iegūst abus bloķētājus\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 << "Vītnes 2 iegūst abus bloķētājus\n";
}

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

Šajā piemērā var rasties deadlock, ja vītnes 1 iegūst mtx1, bet vītnes 2 – mtx2, un abi gaida, kamēr otrs atbrīvos resursu.