【发布时间】:2010-12-08 18:51:57
【问题描述】:
我有一个多线程 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
困扰我的是:这意味着我必须在阅读时锁定树(以避免在阅读时开始垃圾收集)。但是 - 作为副作用 - 我也不能同时进行两个阅读过程。
有什么建议吗?
是否有某种“这是一个只读操作,只与写入冲突”互斥锁?
【问题讨论】:
标签: c++ linux multithreading mutex