2010-01-25 2 views
2

세마포어의 리소스 수를 지정하지 않고 ReadWriteMutex를 만드는 방법은 무엇입니까?

ReadWriteMutex의 일반적인 패턴은 세마포어를 사용하고 모든 리소스를 얻기 위해 writer 루프를 사용하는 것입니다.

inline void write_lock() { 
    ScopedLock lock(acquire_mutex_); 
    for (size_t i=0; i < resource_count_; ++i) { 
    if (sem_wait(semaphore_) < 0) { 
     fprintf(stderr, "Could not acquire semaphore (%s)\n", strerror(errno)); 
    } 
    } 
} 

세마포어 초기화 및 리소스를 임의로 선택하는 동안 리소스 수를 지정해야한다는 점을 제외하면 괜찮습니다. 10 또는 99999의 카운트가 옳다고 생각하지 않습니다. "무한"독자를 허용하는 더 좋은 패턴이 있습니까? (리소스 개수 필요 없음)?

답변

0

해결책을 찾았습니다 : pthread_rwlock_t (Windows의 경우 ReaderWriterLock)을 사용합니다. 이러한 잠금에는 특정 'max_readers_count'가 필요하지 않습니다.

필자가 작성해야 할 때 판독기 항목을 잠그고 원자 판독기 수를 고정하기 위해이 잠금에 대한 구현이 일종의 조건 변수를 사용한다고 생각합니다.

자제 된 세마포어 기반 자물쇠와 이것을 비교하면 작가가 선호된다는 사실이 드러납니다 (처음에는 잘하는 경향이 있습니다).

+0

성능 결과에 놀랐습니다. 세마포어 기반 솔루션이 읽기 및 쓰기 작업을보다 균등하게 인터리빙하고 더 빠르게 실행됩니다 (3.7s 대 4.2s). – gaspard

+0

이것은 항상 사실이 아닙니다. 요일과 기상 조건에 따라 다릅니다 (보이는 것처럼 보입니다). – gaspard

관련 문제