1 min read

스핀락 구현시 참고할점

스핀락을 구현할때 아래와 같이 구현한다.

#include "TheadLock.h"

 Eun::TheadLock::SpinLock::SpinLock() : _object(false) {
}

void Eun::TheadLock::SpinLock::enterSection() {
	while (InterlockedExchange(&this->_object, 1) == 1) continue;
}

void Eun::TheadLock::SpinLock::leaveSection() {
	InterlockedExchange(&this->_object, 0);
}

하지만 위 코드를 테스트시 생각외로 좋은 성능이 안 나오는걸 벤치 마크로 확인할수있다.

리누스 토바즈형님이 이에 대해 의견을 남긴글이 있는데

https://www.realworldtech.com/forum/?threadid=189711&curpostid=189723&fbclid=IwAR1aqMqWNrvY7qcOmhGKUH6m9YkCanEEVIbhEqRlZcRP1Tb4rH053yvs2PE

CPU 캐시 일관성때문에 성능이 더 느리다라는 이야기이다. 이는 실제로도 그렇다 라는 점이다.

다행히 x86에서는 이 문제를 펜티엄4부터 알았고 아래의 명령어를 추가되었다.

이는 NOP 명령어를 주어서 해결한다.

아래의 글을 보면 얼마나 빨라졌는지 확인할수 있다.