일부 표준을 준수한다는 의미에서 "휴대용"을 원한다면 ... 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()
또는 세마포 및 이벤트와 같은 상위 레벨 프리미티브라고 말하십시오.
글쎄, 나는 시스템 호출을 원하지 않으며 이것은 SRW를위한 코드가 아니다. 그들은 빠르다. 내가 원하는 것은이 InterlockedCompareExchange 매직을하고있는 맨손의 뼈 C/어셈블러 코드이다. 동일한 어셈블러 구문을 사용하는 경우 인텔 i386 또는 amd64 플랫폼에서 이식 할 수 있어야합니다. – Lothar
그럴 경우 : http://www.google.com/search?q=rwlock+interlockedcompareexchange - InterlockedCompareExchange()에 대한 x86 명령어는 "lock cmpxchg"입니다. – asveikau
@Lothar - 적절한 차단을 원할 경우 시스템 호출을 완전히 피할 수 없습니다. 즉, 스레드가 잠금을 획득 할 수없는 경우에는 잠자기 상태로 전환해야합니다. 시스템 호출은 경합이있는 경우에만 발생합니다. 시스템 호출을 원하지 않는다면 루프 만 돌리는 것이 유일한 옵션입니다. 나는 당신이 당신의 것을 굴릴 방법을 설명하는 아래의 대답을 추가했다. – BeeOnRope