我有一个多线程 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
困扰我的是:这意味着,我必须在阅读时锁定树(以避免在阅读时开始垃圾收集)。但是 - 作为副作用 - 我也不能同时拥有两个阅读过程。
有什么建议么?
是否有某种“这是一个只读操作,只与写入冲突”互斥锁?