Mutex блокировка только для записи - PullRequest
2 голосов
/ 21 октября 2009

У меня есть многопоточное приложение 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?

Ответы [ 3 ]

10 голосов
/ 21 октября 2009

Просмотр чтение-запись-блокировка .

Вы не указали, какую платформу вы можете использовать, но и pThread и boost реализовали этот шаблон.

4 голосов
/ 21 октября 2009

Концепция представляет собой «общий читатель, одиночный писатель» блокировка, как заявили другие. В средах Linux вы должны иметь возможность использовать pthread_rwlock_t без какой-либо инфраструктуры. Я бы посоветовал посмотреть и на boost::shared_lock.

3 голосов
/ 21 октября 2009

Я предлагаю блокировку чтения-записи . Идея состоит в том, что вы можете приобрести блокировку для «чтения» или «записи», и блокировка позволит использовать несколько читателей, но только один писатель. Очень удобно.

...