Junior
Šta je deadlock?
sobes.tech АИ
Одговор од АИ
Дедлок је ситуација у којој две или више нитова блокирају једна другу, чекајући ресурсе које други нитови у истој групи заузимају.
Услови за настанак дедлока (Кофманови услови):
- Взајамно искључење (Mutual Exclusion): Ресурси се не могу користити истовремено од више нитова.
- Држање и чекање (Hold and Wait): Нитови који већ имају један ресурс чекају да добију додатни ресурс који је заузео други нит.
- Без предаје (No Preemption): Ресурс не може бити присилно одузет од нитова који га поседују; може бити ослобођен само од стране самог нитова.
- Круговско чекање (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 пружа алате за њихово откривање и анализу.