win32에 대해 업그레이드 가능한 읽기 쓰기 잠금을 찾으려고합니다. pthreads rwlock의 동작으로 읽기 잠금을 올리거나 내릴 수 있습니다.업그레이드가 가능한 읽기/쓰기 잠금 Win32
내가 원하는 것은 :
pthread_rwlock_rdlock(&lock);
...read...
if(some condition) {
pthread_rwlock_wrlock(&lock);
...write...
pthread_rwlock_unlock(&lock);
}
...read...
pthread_rwlock_unlock(&lock);
업그레이드 동작이 POSIX에 의해 필요하지만 맥에 리눅스에서 작동하지 않습니다.
현재 업그레이드 할 수있는 작업 구현 (이벤트, 세마포 및 중요 섹션 기반)이 있지만 독자가 활성화되어 있으면 업그레이드가 실패 할 수 있습니다. 실패하면 읽기 잠금 + 재검사 + 쓰기 잠금이 필요합니다.
내가 무엇을 가지고 :
lock.rdlock();
...read...
if(some condition) {
if(lock.tryupgrade()) {
...write...
lock.unlock();
return;
} else {
lock.unlock();
// <- here, other threads may alter the condition ->
lock.wrlock();
if(some condition) { // so, re-check required
...write...
}
lock.unlock();
return;
}
}
...read...
lock.unlock();
편집 : 현상금 :
내가 검색에 여전히,하지만 몇 가지 제한 사항을 추가 할 : 그것은 내 프로세스에만 사용됩니다 (그래서 기반 중요한 섹션에서 OK, WIN32 뮤텍스는 괜찮지 않습니다), 순수 WIN32 API (MFC, ATL 등이 아님) 여야합니다. 읽기 잠금을 얻는 것이 빠르다. (읽기 잠금을 얻는 것이 빠른 경로에 중요한 섹션에 들어 가지 않아야한다.) 어쩌면 InterlockedIncrement 기반 솔루션이 가능할까요?
'boost :: shared_mutex'의 win32 구현이 유망 해 보입니다. pthread 구현은 그리 좋지 않습니다. (필자가 필요로하는 것보다 더 많은 부분을 가지고 있으므로, 아마도 그들이 사용하는 방법은 비표준적인 업그레이드 동작으로 pthread_rwlock_만큼 효율적이지 않습니다.). 나는 그것을 시도해 볼 것입니다 ... – Frunsi
문서의 내용을 읽고 시험해 본 후, 이제 완벽 해졌습니다 :-) – Frunsi