Sobes.tech
Middle+
105

Можете привести пример ситуации, когда происходит взаимная блокировка процессов, заставляющая их зависнуть навсегда?

Сұралған компаниялар
Samsung Research CenterSamsung Research Center

AI-дан жауап

sobes.tech AI

Взаимная блокировка (deadlock) происходит, когда два или более процесса (или потока) одновременно удерживают ресурсы и каждый из них ждёт освобождения ресурса, который удерживает другой процесс. В результате ни один из них не может продолжить работу.

Пример:

  • Процесс A захватывает ресурс R1.
  • Процесс B захватывает ресурс R2.
  • Процесс A пытается захватить ресурс R2 и блокируется, ожидая его освобождения.
  • Процесс B пытается захватить ресурс R1 и также блокируется.

Оба процесса ждут друг друга, что приводит к бесконечной блокировке.

Пример на C++ с мьютексами:

#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 acquired both locks\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 acquired both locks\n";
}

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

В этом примере возможна взаимная блокировка, если thread1 захватит mtx1, а thread2 — mtx2, и оба будут ждать друг друга.