2009-12-04 2 views
4

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 기반 솔루션이 가능할까요?

답변

2

부스트 shared_mutex 클래스는 리더 (공유) 및 작성자 (고유) 잠금과 공유 잠금에서 임시 잠금으로의 업그레이드를 지원합니다. 나는 자신을 작성하지 않는 것이 좋습니다

Example for boost shared_mutex (multiple reads/one write)?

, 그것은 철저하게 테스트 오른쪽 어려워하는 까다로운 일입니다.

+0

'boost :: shared_mutex'의 win32 구현이 유망 해 보입니다. pthread 구현은 그리 좋지 않습니다. (필자가 필요로하는 것보다 더 많은 부분을 가지고 있으므로, 아마도 그들이 사용하는 방법은 비표준적인 업그레이드 동작으로 pthread_rwlock_만큼 효율적이지 않습니다.). 나는 그것을 시도해 볼 것입니다 ... – Frunsi

+0

문서의 내용을 읽고 시험해 본 후, 이제 완벽 해졌습니다 :-) – Frunsi

0

pthread 라이브러리는 'Portable Threads'라이브러리입니다. Windows에서도 지원된다는 의미입니다.)보세요 : Pthreads-w32.

또한 잠금 대신 OpenMP을 사용하십시오. 컴파일러 확장은 휴대용 중요한 섹션, 커널 스레딩 모델, 작업 등을 제공합니다! MS C++은 리눅스에서 g ++뿐만 아니라이 기술을 지원합니다.

건배! :)

+1

실제로 pthread는 POSIX 스레드를 의미합니다. 필요한 서비스를 다운로드하면 Windows는 POSIX를 준수 할 수 있습니다. –

+0

맞습니다. 그렇기 때문에 흔히 "휴대용"이라고 불립니다. :) – kolypto