0
휘발성 값을 사용하는 간단한 다중 판독기/단일 기록기 잠금을 구현하려고합니다.ReaderWriter Lock-free 구현
_InterlockedXXX는 완전한 울타리 장벽을 제공하지만 올바른 경우 "휘발성"키워드도 있지만 가능한 결함 및 개선 사항에 대해 알고 싶습니다. 획득/릴리스 의미론에 대한 경험이 없습니다.
내 코드 :
또한BOOL TryAcquireShared(LONG volatile *lpnValue)
{
LONG initVal;
do
{
initVal = *lpnValue;
if (initVal == 0x80000000L)
return FALSE; //a writer is active
}
while (_InterlockedCompareExchange(lpnValue, initVal+1, initVal) != initVal);
return TRUE;
}
VOID ReleaseShared(LONG volatile *lpnValue)
{
LONG initVal, newVal;
do
{
initVal = *lpnValue;
newVal = (initVal & 0x80000000L) | ((initVal & 0x7FFFFFFFL) - 1);
}
while (_InterlockedCompareExchange(lpnValue, newVal, initVal) != initVal);
return;
}
BOOL TryAcquireExclusive(LONG volatile *lpnValue)
{
LONG i, initVal, newVal;
do
{
initVal = *lpnValue;
if ((initVal & 0x80000000L) != 0)
return FALSE; //another writer is active or waiting
}
while (_InterlockedCompareExchange(lpnValue, initVal | 0x80000000L, initVal) != initVal);
//wait until no readers
while ((*lpnValue & 0x7FFFFFFFL) != 0)
::Sleep(1);
return TRUE;
}
VOID ReleaseExclusive(LONG volatile *lpnValue)
{
_InterlockedExchange(lpnValue, 0);
return;
}
, 당신이 처리 할 수있는 라이브러리를 알고있는 경우에, 저에게 알려주십시오.
의견을 보내 주셔서 감사합니다. 개념은 다음과 같습니다. 스레드가 독점을 요구하면 상위 비트가 켜져 모든 종류의 액세스를 요청하는 다른 스레드가 대기합니다. 또한 excl을 요구하는 스레드. 잠금은 이미 공유 잠금을 잡고있는 다른 스레드가 작업을 마칠 때까지 대기합니다. '0x7FFFFFFFL'에 대한 체크 포인트는 처음에는 너무 많은 독자가 없을 것이라고 가정하기 때문에 검사를하지 않았습니다. –