using System;
using System.Threading;
using System.Threading.Tasks;
/// <summary>
/// deadLock
///
//
/// </summary>
namespace ServerCore
{
class Program
{
/// 1. 근성 spinlock 뺑뺑이 (실제로는 실행하다가 너무 답이없으면 양보를 하면서 조금 쉬다옴) 1,2 번 혼합이라고 보면된다.(실제로도 쉬면 좋음)
/// 2. 양보 스핀락이 랑 같은데 잠시 기다리기
/// 3. 갑질 이벤트를 이용해서 정확한 시점에 들어가기
/// 뭐가 좋다는 개념은 없음(상황에 따라 다다름)
/// 실제 사용할때 여러가지 방법을 혼합해서 사용함
///
static object _lock = new object();
static SpinLock _lock2 = new SpinLock();
/// 하지만 거의 안쓸듯?
/// static Mutex _lock3 = new Mutex();/// 굉장히 느린단점이 있지만, 별도의 프로그램끼리도 동기화를 맞출수 있는 장점이 있음
///ex 온라인 게임에서 보상을 줄때
/// [] [] [] 아이템 3개를 보상으로 받는다고 할때
/// 운영 GM이 추가로 더 주기로 할 수 있다고 반영할때
///
class Reward
{
}
///RWLock ReaderWriteLock
static ReaderWriterLockSlim _lock3 = new ReaderWriterLockSlim();
/// <summary>
/// 바꿀확률이 거의 0에 수렴하면 이런식으로 구현하면 손해를 본다
/// 99.999999 0.0000001%
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
static Reward GetRewardById(int id)
{
_lock3.EnterReadLock();
_lock3.ExitReadLock();
return null;
}
static void AddReward(Reward reward)
{
_lock3.EnterWriteLock();
_lock3.ExitWriteLock();
}
static void Main(string[] args)
{
lock (_lock)
{
}
bool lockTaken = false;
try
{
_lock2.Enter(ref lockTaken);
}
finally
{
if(lockTaken)
_lock2.Exit();
}
}
}
}
댓글 없음:
댓글 쓰기