Sobes.tech
Middle+

Jarayonlarning o'zaro to'xtash holatiga misol keltira olasizmi, bu ularni abadiy to'xtatib qo'yadi?

sobes.tech AI

AIdan javob

O'zaro blokirovka (deadlock) ikki yoki undan ortiq jarayonlar (yoki oqimlar) bir vaqtning o'zida resurslarni ushlab turishi va har biri boshqasining resursini bo'shatishini kutishi bilan yuzaga keladi. Natijada, hech biri ishni davom ettira olmaydi.

Misol:

  • A jarayoni R1 resursini oladi.
  • B jarayoni R2 resursini oladi.
  • A jarayoni R2 resursini olishga harakat qiladi va bloklanadi, uni bo'shatishini kutmoqda.
  • B jarayoni R1 resursini olishga harakat qiladi va ham bloklanadi.

Ikki jarayon bir-birini kutmoqda, bu esa cheksiz blokirovkaga olib keladi.

C++ bilan mutexlar misoli:

#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 ikkala lockni ham oldi\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 ikkala lockni ham oldi\n";
}

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

Bu misolda, agar thread1 mtx1 ni olgan bo'lsa va thread2 mtx2 ni olgan bo'lsa, va ikkalasi ham bir-birining resursini kutayotgan bo'lsa, deadlock yuzaga kelishi mumkin.