2013-09-27 1 views
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; 
} 

, 당신이 처리 할 수있는 라이브러리를 알고있는 경우에, 저에게 알려주십시오.

답변

0
  • TryAcquireShared는 * lpnValue가 증가하기 전에 * lpnValue가 0x7FFFFFFFL인지 확인해야합니다.
  • ReleaseShared는 * lpnValue에 0x80000000L 비트가 설정되어 있지 않은 것으로 주장해야합니다. 공유 잠금을 해제 할 경우 독점 잠금이 없어야합니다.
  • TryAcquireExclusive는 0x80000000L 비트를 설정하기 전에 * lpnValue가 0인지 확인해야합니다.
  • 공유 aquire와 독점 aquire는 일정한 양의 회전마다 잠 (1) 전화를해야합니다.
  • TryAcquireExclusive에서 다음 부분을 이해할 수 없습니다. 독점적 인 자물쇠가있는 경우 독자를 기다리는 이유는 무엇입니까?

    while ((* lpnValue & 0x7FFFFFFFL)! = 0) :: 수면 (1);

+0

의견을 보내 주셔서 감사합니다. 개념은 다음과 같습니다. 스레드가 독점을 요구하면 상위 비트가 켜져 모든 종류의 액세스를 요청하는 다른 스레드가 대기합니다. 또한 excl을 요구하는 스레드. 잠금은 이미 공유 잠금을 잡고있는 다른 스레드가 작업을 마칠 때까지 대기합니다. '0x7FFFFFFFL'에 대한 체크 포인트는 처음에는 너무 많은 독자가 없을 것이라고 가정하기 때문에 검사를하지 않았습니다. –