2009-10-21 4 views
2

메모리 (캐시 된 데이터)에 복잡한 데이터 구조를 보유하는 다중 스레드 C++ 응용 프로그램이 있습니다.뮤텍스 잠금 켜기 쓰기

방금 ​​데이터를 읽는 동안 모든 것이 훌륭합니다. 데이터에 액세스하려는만큼의 스레드를 가질 수 있습니다.

그러나 캐시 된 구조는 정적이 아닙니다.

  • 요청 된 데이터 항목을 사용할 수없는 경우 데이터베이스에서 읽은 다음 데이터 트리에 삽입됩니다. 이것은 아마도 문제가되지 않을 것이고, 새로운 데이터 항목을 트리에 추가하는 동안 뮤텍스를 사용하더라도 몇 개의 사이클 만 걸릴뿐입니다 (포인터를 추가하는 것입니다).
  • 가끔씩 실행되는 가비지 수집 프로세스가 있습니다. 트리에서 모든 이전 항목을 제거합니다. 그렇게하려면 메모리에서 제거 될 데이터를 다른 프로세스가 현재 액세스하지 않도록 모든 것을 잠궈 야합니다. 또한 캐시에서 읽는 동안 트리를 잠궈 야하므로 항목이 처리되는 동안 항목을 제거하지 않습니다 ("같은 일을 다른 방법으로 처리").

"의사 코드"

무엇 나를 괴롭 히고
function getItem(key) 
    lockMutex() 
    foundItem = walkTreeToFindItem(key) 
    copyItem(foundItem, safeCopy) 
    unlockMutex() 
    return safeCopy 
end function 

function garbageCollection() 
    while item = nextItemInTree 
     if (tooOld) then 
     lockMutex() 
     deleteItem(item) 
     unlockMutex() 
     end if 
    end while 
end function 

: 이것은 의미, 내가 읽고 있어요 동안 나무를 고정해야한다는 (내가 읽는 동안 시작 가비지 수집을 피하기 위해). 그러나 부작용으로 나는 동시에 두 개의 독서 과정을 가질 수 없습니다.

제안 사항?

"여기가 쓰기와 충돌 만하는 읽기 전용 동작입니까?"

+1

관련 항목 : http://stackoverflow.com/questions/244316/reader-writer-locks-in-c –

답변

10

read-write-lock을 살펴보십시오.

사용할 프레임 워크를 지정하지 않았지만 pThreadboost 모두 해당 패턴을 구현했습니다.

+0

linux 태그에 주목하십시오. –

3

나는 reader-writer lock을 제안합니다. 아이디어는 "읽기"또는 "쓰기"에 대한 자물쇠를 획득 할 수 있으며 자물쇠는 여러 독자를 허용하지만 하나의 작성자 만 허용합니다. 매우 편리합니다.

+3

큐잉 원칙이 있습니다. 따라서 작가가 액세스를 요청하면 ' 읽지 않은 기간을 기다려야하지만 액세스를 획득하고 작업을 수행 할 때까지 향후 읽기 요청을 지연시킵니다. –

4

개념은 "공유 된 독자, 단일 작성자" 다른 사람이 말한 것처럼 잠금입니다. 리눅스 환경에서는 프레임 워크없이 pthread_rwlock_t을 사용할 수 있어야합니다. 나는 또한 boost::shared_lock을 조사 할 것을 제안 할 것이다.

관련 문제