For me
[Server] Lock - 2 본문
DeadLock
상황
using System;
namespace Server
{
class SessionManager
{
private static object _lock = new object();
public static void SessionTest()
{
lock (_lock)
{
}
}
public static void Test()
{
lock (_lock)
{
UserManager.Test();
}
}
}
class UserManager
{
private static object _lock = new object();
public static void UserTest()
{
lock (_lock)
{
}
}
public static void Test()
{
lock (_lock)
{
SessionManager.SessionTest();
}
}
}
class Program
{
private static int number = 0;
private static object _obj = new Object();
static void Thread1()
{
for (int i = 0; i < 10000; i++)
{
SessionManager.Test();
}
}
static void Thread2()
{
for (int i = 0; i < 10000; i++)
{
UserManager.Test();
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread1);
Task t2 = new Task(Thread2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(number);
}
}
}
=> 빠져나오지 못함 DeadLock 발생
해결방안
1) FastLock 클래스 구현 (id 추적)
하지만.. DeadLock은 완전히 막을 수 없음
'Server > Study' 카테고리의 다른 글
[Server] Context Switching (0) | 2023.04.26 |
---|---|
[Server] Lock - 3 (SpinLock) (0) | 2023.04.26 |
[Server] Lock - 1 (0) | 2023.04.26 |
[Server] Interlocked (1) | 2023.04.26 |
[Server] MemoryBarrier (0) | 2023.04.25 |