문제

메모리에서 복잡한 데이터 구조를 보유하는 멀티 스레드 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 "라는 글과 충돌하는 준비된 행동입니다.

도움이 되었습니까?

해결책

들여다보다 읽기 쓰기 잠금.

사용할 수있는 프레임 워크를 지정하지 않았지만 둘 다 pthread 그리고 후원 그 패턴을 구현했습니다.

다른 팁

개념은 a "공유 독자, 싱글 작가" 다른 사람들이 말한대로 잠금. Linux 환경에서는 사용할 수 있어야합니다 pthread_rwlock_t 프레임 워크없이. 나는 조사하는 것이 좋습니다 boost::shared_lock 또한.

나는 제안한다 독자 작가 잠금. 아이디어는 "읽기"또는 "쓰기"에 대한 자물쇠를 획득 할 수 있으며 잠금 장치는 여러 독자 만 허용하지만 한 명의 작가 만 허용합니다. 매우 편리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top