임계 구역에 진입이 불가능 할 때 진입이 가능할 때까지 루프를 돌면서 재시도 하는 방식으로 구현한 락을 말한다.

volatile int lock = 0;
 
void critical() {
	while (test_and_set(&lock))
	// critical section
	lock = 0;
}
int TestAndSet(int* lockPtr) {
	int oldLock = *lockPtr;
	*lockPtr = 1;
	return oldLock;
} 

TestAndSet은 atomic 명령어이다.

atomic이란?

atomic은 원자적이라는 뜻이다.
실행 중간에 간섭받거나 중단되지 않으며 같은 메모리 영역에 대해 동시에 실행되지 않는 것을 말한다.

문제점

스핀락은 Busy-Waiting 방식이기에 CPU 리소스에 낭비가 발생한다.

void critical() {
	while (test_and_set(&lock)) // 반복적으로 잠금상태인지 검증
	lock = 0;
}

Busy-Waiting

  • 원하는 자원을 얻기 위해 기다리는 것이 아니라 권한을 얻을 때까지 반복적으로 확인하는 것을 의미한다.
  • CPU의 자원을 쓸데 없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식이다.