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