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 << "Тўрқин 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 << "Тўрқин 2 икки ёпиқни ҳам олди\n";
}
int main() {
std::thread t1(thread1);
std::thread t2(thread2);
t1.join();
t2.join();
return 0;
}
Бу мисолда, агар тўрқин 1 mtx1 ни олиб, тўрқин 2 mtx2 ни олиб, ва ҳар иккиси бошқасининг ресурсини кутса, deadlock юзага келиши мумкин.