Sobes.tech
Junior

Deadlock чист?

sobes.tech AI

Ҷавоб аз AI

Дедлок — это ҳолати беназмӣ дар барномасозии бисёрсоҳавӣ, вақте ки ду ё бештар аз ду сӯрох блок мекунанд якдигарро, интизори захираҳое, ки дигар сӯрохҳо дар гурӯҳи ҳамон истифода мебаранд.

Шартҳои пайдоиши дедлок (шартҳои Кофман):

  1. Маҳдудиятҳои мутақобил (Mutual Exclusion): Захираҳо наметавонанд ҳамзамон аз ҷониби чанд сӯрох истифода шаванд.
  2. Держӣ ва интизорӣ (Hold and Wait): Сӯрохҳое, ки аллакай як захираро доранд, интизори гирифтани захираҳои иловагӣ мебошанд, ки онҳоро дигар сӯрохҳо дар бар мегиранд.
  3. Бе муқаррарӣ (No Preemption): Захира наметавонад маҷбурӣ аз сӯрохе гирифта шавад, ки онро дорад; танҳо сӯрох метавонад онро озод кунад.
  4. Интизории даврӣ (Circular Wait): Чорчӯба аз ду ё бештар сӯрохҳо вуҷуд дорад, ки ҳар яке интизори захирае аст, ки онро сӯрохе, ки дар пайроҳа аст, дорад.

Масалан оддӣ барои дедлок:

Ду сӯрох, ду захира (A ва B).

  • Сӯрох 1 захира A-ро мегирад.
  • Сӯрох 2 захира B-ро мегирад.
  • Сӯрох 1 кӯшиш мекунад, ки захира B-ро бигирад (ки он дар дасти Сӯрох 2 аст).
  • Сӯрох 2 кӯшиш мекунад, ки захира A-ро бигирад (ки он дар дасти Сӯрох 1 аст).

Ҳарду сӯрох барои ҳамеша блок карда шудаанд.

// Масалан оддӣ барои симулясияи дедлок бо истифода аз lock
object resourceA = new object();
object resourceB = new object();

void Thread1Method()
{
    lock (resourceA) // Сӯрох 1 захира A-ро мегирад
    {
        Console.WriteLine("Сӯрох 1 захира A-ро гирифт");
        Thread.Sleep(100); // Каме таъхир барои нишон додани имконияти гузариш байни сӯрохҳо
        lock (resourceB) // Сӯрох 1 кӯшиш мекунад, ки захира B-ро бигирад
        {
            Console.WriteLine("Сӯрох 1 захира B-ро гирифт");
        }
    }
}

void Thread2Method()
{
    lock (resourceB) // Сӯрох 2 захира B-ро мегирад
    {
        Console.WriteLine("Сӯрох 2 захира B-ро гирифт");
        Thread.Sleep(100); // Каме таъхир
        lock (resourceA) // Сӯрох 2 кӯшиш мекунад, ки захира A-ро бигирад
        {
            Console.WriteLine("Сӯрох 2 захира A-ро гирифт");
        }
    }
}

// Таҳия ва оғоз кардани сӯрохҳо метавонад ба дедлок оварда расонад.
// new Thread(Thread1Method).Start();
// new Thread(Thread2Method).Start();

// Иҷрои ин код метавонад, аммо ҳатмӣ нест, дедлок-ро нишон диҳад,
// зеро тартиби иҷрои он аз планировщик вобаста аст.
// Агар Сӯрох 1 A-ро бигирад ва Сӯрох 2 B-ро, пеш аз он ки аввал
// B-ро бигирад, дедлок ба вуҷуд меояд.

Пешгирии дедлокҳо одатан бо:

  • Тартиб додани гирифтани захираҳо (ҳамеша захираҳоро дар як тартиб гирифтан).
  • Истифодаи усулҳои гирифтани захира бо мӯҳлати вақт (сӯрох кӯшиш мекунад, ки дар вақти муайян захираро бигирад).
  • Тарҳрезӣ кардани системаи бе ниёз ба нигоҳ доштани чанд блокировка дар як вақт.
  • Истифодаи амалҳои атомӣ ё примитивҳои баландтар барои ҳамоҳангсозӣ (масалан, Monitor.TryEnter, ReaderWriterLockSlim).

Дедлокҳо душвор барои ошкор кардан мебошанд, зеро онҳо аз тартиби иҷрои сӯрохҳо вобастаанд ва аксар вақт танҳо дар зери бор пайдо мешаванд. Visual Studio асбобҳоро барои ошкор ва таҳлили онҳо пешниҳод мекунад.