스핀락 구현시 참고할점
스핀락을 구현할때 아래와 같이 구현한다.
#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);
}
하지만 위 코드를 테스트시 생각외로 좋은 성능이 안 나오는걸 벤치 마크로 확인할수있다.
리누스 토바즈형님이 이에 대해 의견을 남긴글이 있는데
CPU 캐시 일관성때문에 성능이 더 느리다라는 이야기이다. 이는 실제로도 그렇다 라는 점이다.
다행히 x86에서는 이 문제를 펜티엄4부터 알았고 아래의 명령어를 추가되었다.
이는 NOP 명령어를 주어서 해결한다.
아래의 글을 보면 얼마나 빨라졌는지 확인할수 있다.