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 << "Thread 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 << "Thread 2 придоби и двата мютекса\n";
}

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

В този пример може да възникне deadlock, ако thread1 вземе mtx1, а thread2 вземе mtx2, и двамата чакат другият да освободи ресурса.