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):
- Qarşılıqlı istisna (Mutual Exclusion): Resurslar eyni zamanda bir neçə iş parçacığı tərəfindən istifadə oluna bilməz.
- 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.
- 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.
- 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.