Sobes.tech
Junior

Šta je deadlock?

sobes.tech АИ

Одговор од АИ

Дедлок је ситуација у којој две или више нитова блокирају једна другу, чекајући ресурсе које други нитови у истој групи заузимају.

Услови за настанак дедлока (Кофманови услови):

  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).

Обa нита су блокирана заувек.

// Једноставан пример симулације дедлока коришћењем 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 пружа алате за њихово откривање и анализу.