2022년 3월 7일 월요일

[c# ReaderWriterLockSlim]

 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();
            }
        }
    }
}

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...