2009-12-08 2 views
3

나는 완전히 윈도우 SRW 구현의 품질을 날려 버렸다. 그것의 더 빠른 섹션과 그것의 단지 몇 바이트 메모리 오버 헤드.윈도우 비스타의 슬림 리더 라이터 락의 크로스 플랫폼 버전이 있습니까?

불행하게도 그것을위한 크로스 플랫폼 구현이 있다면 아무도 알고 있지,이 순수한 사용자의 토지 구현으로 만 윈도우 비스타/윈도우 7

에게 무엇입니까? 솔루션을 리버스 엔지니어링 한 사람이 있습니까?

그리고 나는 100 개 이하의 LOC 솔루션을 끌어 올리기 위해 부스트와 같은 것들을 추가하고 싶지 않습니다.

답변

3

일부 표준을 준수한다는 의미에서 "휴대용"을 원한다면 ... POSIX 스레드를 사용하는 경우 pthread_rwlock_init()과 친구들이 있습니다. 물론 이것은 일반적으로 Windows에서 사용되는 것이 아니라 유닉스 유형의 OS에서 사용됩니다.

"여러 버전의 Windows로 이식 가능합니다"라는 의미에서 "휴대용"을 의미하는 경우 RW 잠금을 구현하는 ntdll에는 문서화되지 않은 일부 호출이 있습니다. RtlAcquireResourceShared()RtlAcquireResourceExclusive(). 여기

WINE's implementation에서 몇 가지 프로토 타입은 다음과 같습니다

void WINAPI RtlInitializeResource(LPRTL_RWLOCK rwl); 
void WINAPI RtlDeleteResource(LPRTL_RWLOCK rwl); 
BYTE WINAPI RtlAcquireResourceExclusive(LPRTL_RWLOCK rwl, BYTE fWait); 
BYTE WINAPI RtlAcquireResourceShared(LPRTL_RWLOCK rwl, BYTE fWait); 
void WINAPI RtlReleaseResource(LPRTL_RWLOCK rwl); 

참고 자신 ntdll.dll에서 GetProcAddress() 다음에있을 수 있습니다. 참조 구조에 관해서는

는 ... 여기에 와인 선언 내용은 다음과 같습니다

typedef struct _RTL_RWLOCK { 
    RTL_CRITICAL_SECTION rtlCS; 

    HANDLE hSharedReleaseSemaphore; 
    UINT uSharedWaiters; 

    HANDLE hExclusiveReleaseSemaphore; 
    UINT uExclusiveWaiters; 

    INT iNumberActive; 
    HANDLE hOwningThreadId; 
    DWORD dwTimeoutBoost; 
    PVOID pDebugInfo; 
} RTL_RWLOCK, *LPRTL_RWLOCK; 

것은 당신의 pthreads를 사용하지 않으려는 당신이 스케치 문서화되지 않은 기능에 연결하지 않으려면 ... 당신이 할 수있는 rwlock 구현을 찾아보고 다른 작업과 관련하여 직접 구현하십시오 ... InterlockedCompareExchange() 또는 세마포 및 이벤트와 같은 상위 레벨 프리미티브라고 말하십시오.

+0

글쎄, 나는 시스템 호출을 원하지 않으며 이것은 SRW를위한 코드가 아니다. 그들은 빠르다. 내가 원하는 것은이 InterlockedCompareExchange 매직을하고있는 맨손의 뼈 C/어셈블러 코드이다. 동일한 어셈블러 구문을 사용하는 경우 인텔 i386 또는 amd64 플랫폼에서 이식 할 수 있어야합니다. – Lothar

+0

그럴 경우 : http://www.google.com/search?q=rwlock+interlockedcompareexchange - InterlockedCompareExchange()에 대한 x86 명령어는 "lock cmpxchg"입니다. – asveikau

+0

@Lothar - 적절한 차단을 원할 경우 시스템 호출을 완전히 피할 수 없습니다. 즉, 스레드가 잠금을 획득 할 수없는 경우에는 잠자기 상태로 전환해야합니다. 시스템 호출은 경합이있는 경우에만 발생합니다. 시스템 호출을 원하지 않는다면 루프 만 돌리는 것이 유일한 옵션입니다. 나는 당신이 당신의 것을 굴릴 방법을 설명하는 아래의 대답을 추가했다. – BeeOnRope

0

슬림 rwlock과 똑같은 아이디어를 사용하여 자신 만의 롤을 만들 수 있습니다 (최소한 내가 생각한 것, 이것은 매우 간단하므로). 나는이 접근법을 this other question에 자세히 설명했다.

"공정한"측면을 대부분 무시할 수 있지만 구현은 본질적으로 동일합니다. 특히 무한한 독자 스트림을 작성자가 차단하도록하려는 경우 잠금 장치에 이미 독자가있는 경우 (즉, 상태 (2) 및 (3)이 다소 붕괴 됨) 독자가 항상 읽도록 허용합니다.

크로스 플랫폼 각도의 경우 windows 이벤트 또는 pthread condvars 중 하나를 사용하여 차단을 구현해야하지만 두 경우 모두 세부 사항이 비슷합니다. 또는 전혀 차단하지 않으려는 경우 유일한 선택은 회전 (이상적으로는 CPU에 좋은 pause 명령어를 사용하는 것입니다.)하면 차단 코드에 대한 전체 폴백을 제거하여 작업을 훨씬 쉽게 할 수 있습니다.

좋은 구현은 아마도 몇 백 LOC입니다. 내가 쓴 (가까운 소스, 나는 그것을 공유 할 수 없다) 그리고 그것은 탁월하게 수행한다. (슬림 락보다 좋다.)