Mutex 잠금 장치 만 사용합니다
-
05-07-2019 - |
문제
메모리에서 복잡한 데이터 구조를 보유하는 멀티 스레드 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
나를 괴롭히는 것 : 이것은 내가 읽는 동안 나무를 잠그야한다는 것을 의미합니다 (읽는 동안 쓰레기 수집이 시작될 수있는 쓰레기 수집을 피하기 위해). 그러나 부작용으로 - 나는 더 이상 두 개의 읽기 과정을 동시에 가질 수 없습니다.
제안이 있습니까?
"이것은"MUTEX "라는 글과 충돌하는 준비된 행동입니다.
다른 팁
개념은 a "공유 독자, 싱글 작가" 다른 사람들이 말한대로 잠금. Linux 환경에서는 사용할 수 있어야합니다 pthread_rwlock_t
프레임 워크없이. 나는 조사하는 것이 좋습니다 boost::shared_lock
또한.
나는 제안한다 독자 작가 잠금. 아이디어는 "읽기"또는 "쓰기"에 대한 자물쇠를 획득 할 수 있으며 잠금 장치는 여러 독자 만 허용하지만 한 명의 작가 만 허용합니다. 매우 편리합니다.
제휴하지 않습니다 StackOverflow