class SpinLock
{
volatile int _locked = 0;
public void Acquire()
{
while(true)
{
int expected = 0;
int desire = 1;
int original = Interlocked.CompareExchange(ref _locked, desire, expected);
if(original == 0)
break;
// 쓰레드를 쉬게 하는 방법은 세 가지가 있다
Thread.Sleep(1); // 무조건 1ms를 쉬어라
Thread.Sleep(0); // 조건부 양보 -> 자신보다 우선순위가 낮은 쓰레드에게는 양보 불가
Thread.Yield(); // 관대한 양보 -> 조건없이 쓰레드 우선권 양보
}
}
public void Release()
{
_locked = 0;
}
}
- Context Switching
- 쓰레드의 권한이 이전되며 필요한 데이터를 캐시에 저장하는데
- 그 필요한 데이터 복사 시간이 필요해진다.
- 따라서 너부 빈번한 쓰레드 권한 이전은 오히려 단점이 된다