Middle
Deadlock-ты туындату үшін қажет минималды mutex саны қанша?
sobes.tech AI
AI-дан жауап
Дедлок пайда болу үшін минималды мьютекстер саны — екі.
Дедлок төрт шарт орындалғанда пайда болуы мүмкін (Коффман шарттары):
- Өзара шығару (Mutual Exclusion): Ресурстар бір уақытта бірнеше процесс қолдана алмайды (бірлесіп қолданылмайды). Бұл жағдайда мьютекстер оны қамтамасыз етеді.
- Ұстау және күтім (Hold and Wait): Бір мьютексті иеленген процесс басқа бір мьютексті алуға тырысады, ол басқа процесс тарапынан қолданылуда.
- Бұйырылмайтындығы (No Preemption): Иеленген мьютекс күшпен алынып тасталмайды; ол тек процесс өзі босатуы керек.
- Циклдік күтім (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-ді алса, онда әрқайсысы басқа мьютексті күтеді, нәтижесінде циклдік күтім пайда болады.