Sobes.tech
Middle

Deadlock-ты туындату үшін қажет минималды mutex саны қанша?

sobes.tech AI

AI-дан жауап

Дедлок пайда болу үшін минималды мьютекстер саны — екі.

Дедлок төрт шарт орындалғанда пайда болуы мүмкін (Коффман шарттары):

  1. Өзара шығару (Mutual Exclusion): Ресурстар бір уақытта бірнеше процесс қолдана алмайды (бірлесіп қолданылмайды). Бұл жағдайда мьютекстер оны қамтамасыз етеді.
  2. Ұстау және күтім (Hold and Wait): Бір мьютексті иеленген процесс басқа бір мьютексті алуға тырысады, ол басқа процесс тарапынан қолданылуда.
  3. Бұйырылмайтындығы (No Preemption): Иеленген мьютекс күшпен алынып тасталмайды; ол тек процесс өзі босатуы керек.
  4. Циклдік күтім (Circular Wait): Процестер тізбегі бар, онда әр процесс келесі процесс иеленген мьютексті күтеді, ал соңғы процесс алғашқы мьютексті күтеді.

Екі мьютекспен мысал:

#include <mutex>
#include <thread>
#include <iostream>

std::mutex mtx1;
std::mutex mtx2;

void thread1_func() {
    mtx1.lock(); // 1-ші ағын mtx1-ді алады
    std::cout << "Thread 1 mtx1-ді алды" << std::endl;
    // Өзіндік кідіріс, дедлок ықтималдығын арттыру үшін
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    mtx2.lock(); // 1-ші ағын mtx2-ді алуға тырысады (мүмкін, оны 2-ші ағын қолдануда)
    std::cout << "Thread 1 mtx2-ді алды" << std::endl;

    mtx2.unlock();
    mtx1.unlock();
}

void thread2_func() {
    mtx2.lock(); // 2-ші ағын mtx2-ді алады
    std::cout << "Thread 2 mtx2-ді алды" << std::endl;
    // Өзіндік кідіріс, дедлок ықтималдығын арттыру үшін
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    mtx1.lock(); // 2-ші ағын mtx1-ді алуға тырысады (мүмкін, оны 1-ші ағын қолдануда)
    std::cout << "Thread 2 mtx1-ді алды" << std::endl;

    mtx1.unlock();
    mtx2.unlock();
}

int main() {
    std::thread t1(thread1_func);
    std::thread t2(thread2_func);

    t1.join();
    t2.join();

    return 0;
}

Бұл мысалда, егер 1-ші ағын mtx1-ді алса, ал 2-ші ағын mtx2-ді алса, онда әрқайсысы басқа мьютексті күтеді, нәтижесінде циклдік күтім пайда болады.