스핀 록은 쓰기가 동기화되는 공유 int 일뿐입니다. 프로세서에는 특별한 플래그가 없습니다. 따라서 스핀 록을 한 개 이상 확보 할 수 있습니다. (하지 말아야 ...)
유니 프로세서 시스템이 잠기는 것을 방지하기 위해 Windows는 IRQL을 DISPATCH_LEVEL
으로 올립니다. 프로세서는 DISPATCH_LEVEL
에서 실행되는 하나의 '스레드'만 가질 수 있으므로 동시에 여러 스핀 록을 잠그는 것이이 시스템에서 안전합니다. 교환기가 같은 메모리 버스의 모든 프로세서에 대한 원자 적으로 발생하는 것을
LONG lock = 0;
KeAcquireSpinlock(...)
{
// raise irql. etc.
while(InterlockedExchange(&lock, 1) != 0)
/* do nothing*/;
}
KeReleaseSpinLock(...)
{
InterlockedExchange(&lock, 0);
// lower irql ... etc.
}
InterlockedExchange
보장 (이 100 % 사실 및 세부 사항으로 인해 분기 수) :
구현은 다음과 같이해야한다. 따라서 메모리 버스를 잠 그거나 적어도 특정 캐시 라인의 단독 소유권을 강제해야합니다.
"프로세서는 DISPATCH_LEVEL에서 하나의 '스레드'만 실행할 수 있으므로 동시에 여러 스핀 록을 잠그면 시스템에서 안전합니다." 그 정보였습니다. 있어야 할 곳에 없는. 감사합니다 이렇게하면 uni 프로세서 스핀 록에 대한 의심이 사라집니다. – bakra