메모리 (캐시 된 데이터)에 복잡한 데이터 구조를 보유하는 다중 스레드 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
: 이것은 의미, 내가 읽고 있어요 동안 나무를 고정해야한다는 (내가 읽는 동안 시작 가비지 수집을 피하기 위해). 그러나 부작용으로 나는 동시에 두 개의 독서 과정을 가질 수 없습니다.
제안 사항?
"여기가 쓰기와 충돌 만하는 읽기 전용 동작입니까?"
관련 항목 : http://stackoverflow.com/questions/244316/reader-writer-locks-in-c –