Sobes.tech
Back to questions
Middle+
86

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

Companies where asked
Samsung Research CenterSamsung Research Center

Answer from 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, и оба будут ждать друг друга.