스핀락

C++

2022. 2. 6. 20:00

c++에서 스핀락을 구현해보려했다.

이론 자체는 간단한데, 기존의 Mutex 락은 현재 스레드를 Paused 하여 

다른 스레드를 깨워 작업을 하는 형식인데, 잦은 컨텍스트 스위칭은 오버헤드를 발생시키니

락을 획득하기까지 busy waiting 상태로 계속 뺑뺑이돌며 커널 영역으로 돌입하지않고 기다리는 형식이다.

 

c++에서 제공하는 compare_exchange_weak 함수를 이용할 생각이었는데..

잘 동작하지 않아서 문제이다 ㅜ. 문제의 코드는 이 부분이다.

void SpinLock::Lock(const char* func)
{
	while (true) {
		int exchanged = 1;
		int expected = 0;
		if (_lock.compare_exchange_weak(expected,exchanged,std::memory_order::memory_order_acquire)) {
			//std::cout << &expected <<" : "<< func << std::endl;
			break;
		}
	}
}

 

위의 expected를 while문 밖으로 빼면 제대로 동작하지않는데.. 이유가 무엇일까?

throw bug에 문제를 던지고 기다리는 중.. 

스핀락 관련하여 다른 포스팅들을 보면 atomic_flag를 이용한 내용들 뿐이라... 

혹시 아시는 분께서는 답글을 달아주시면 감사하겠습니다 ㅎㅅㅎ.