Sobes.tech
Junior

Deadlock nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Deadlock — çox iş parçacıklı proqramlaşdırmada çıxılmaz vəziyyətdir; burada iki və ya daha çox iş parçacığı bir-birini bloklayır və digər iş parçacqları tərəfindən istifadə olunan resursları gözləyir.

Deadlock-un baş vermə şərtləri (Coffman şərtləri):

  1. Qarşılıqlı istisna (Mutual Exclusion): Resurslar eyni zamanda bir neçə iş parçacığı tərəfindən istifadə oluna bilməz.
  2. Saxlama və gözləmə (Hold and Wait): Artıq bir resursa sahib olan iş parçacığı başqa bir iş parçacığı tərəfindən istifadə olunan başqa bir resursu gözləyir.
  3. Preemption yoxdur (No Preemption): Resurs zorla bir iş parçacığından alına bilməz; yalnız iş parçacığı özü tərəfindən sərbəst buraxıla bilər.
  4. Dövrü gözləmə (Circular Wait): İki və ya daha çox iş parçacığından ibarət zəncir mövcuddur və hər biri növbəti iş parçacığının tutduğu resursu gözləyir (dairəvi gözləmə).

Sadə deadlock nümunəsi:

İki iş parçacığı, iki resurs (A və B).

  • İş parçacığı 1, A resursunu ələ keçirir.
  • İş parçacığı 2, B resursunu ələ keçirir.
  • İş parçacığı 1, B-ni ələ keçirməyə çalışır (ki bu, İş parçacığı 2 tərəfindən tutulur).
  • İş parçacığı 2, A-ni ələ keçirməyə çalışır (ki bu, İş parçacığı 1 tərəfindən tutulur).

Hər iki iş parçacığı sonsuz müddətə bloklanır.

// Lock istifadə edərək deadlock simulasyonu nümunəsi
object resourceA = new object();
object resourceB = new object();

void Thread1Method()
{
    lock (resourceA) // İş parçacığı 1 A-ı ələ keçirir
    {
        Console.WriteLine("İş parçacığı 1 resurs A-ı aldı");
        Thread.Sleep(100); // İş parçacığı dəyişimini göstərmək üçün qısa fasilə
        lock (resourceB) // İş parçacığı 1 B-ni ələ keçirməyə çalışır
        {
            Console.WriteLine("İş parçacığı 1 resurs B-ı aldı");
        }
    }
}

void Thread2Method()
{
    lock (resourceB) // İş parçacığı 2 B-ni ələ keçirir
    {
        Console.WriteLine("İş parçacığı 2 resurs B-ı aldı");
        Thread.Sleep(100); // Qısa fasilə
        lock (resourceA) // İş parçacığı 2 A-ni ələ keçirməyə çalışır
        {
            Console.WriteLine("İş parçacığı 2 resurs A-ı aldı");
        }
    }
}

// Thread-lərin yaradılması və işə salınması deadlock-a səbəb ola bilər.
// new Thread(Thread1Method).Start();
// new Thread(Thread2Method).Start();

// Bu kodun işlədilməsi, planlayıcıya bağlı olaraq, deadlock-u göstərə bilər və ya göstərə bilməz.
// Əgər İş parçacığı 1 A-ı ələ keçirərsə və İş parçacığı 2 B-yi ələ keçirərsə, ilk
// B-ni ələ keçirmədən əvvəl, deadlock yaranar.