Server/Study

[Server] Lock - 3 (SpinLock)

GiveZero 2023. 4. 26. 15:48

SpinLock

1) bool 형식을 사용하여 구현

당연한 결과지만..

class SpinLock
    {
        volatile bool _locked = false;
        
        public void Acquire()
        {
             while (_locked)
             {
                 
             }
            
             _locked = true;
        }

        public void Release()
        {
            _locked = false;
        }
    }

결과 작동 X

 

2) Interlocked.Exchange() 을 이용하여 구현

 

class SpinLock
    {
        volatile int _locked = 0;
        
        public void Acquire()
        {
            while (true)
            {                 
                 int original = Interlocked.Exchange(ref _locked, 1); // original 에서는 하나의 스레드에서 사용하는 값 
                 if (original == 0)
                 {
                      break;
                 }                 
            }
        }

        public void Release()
        {
            _locked = 0;
        }
    }

결과 작동 O

 

3) InterLocked.CompareExchange()사용하여 구현

class SpinLock
    {
        volatile int _locked = 0;
        // volatile bool _locked = false;
        
        public void Acquire()
        {
            while (true)
            {              
                //CAS (Compare-And-Swap)                
                 int expected = 0;
                 int desired = 1;
                 
		// if(_lock == expected ) _lock = desired; 와 같음
                 if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) 
                 {
                     break;
                 }       
            }
        }

        public void Release()
        {
            _locked = 0;
        }
    }

결과 작동 O