互斥锁定仅写入

Bla*_*laM 2 c++ linux multithreading mutex

我有一个多线程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
Run Code Online (Sandbox Code Playgroud)

什么困扰我:这意味着,我在阅读时必须锁定树(以避免在我阅读时开始垃圾收集).然而 - 作为一种副作用 - 我也不能同时拥有两个阅读过程.

有什么建议?

是否存在某种"这只是一种只与写入冲突的只读动作"Mutex?

Sha*_*men 10

查看read-write-lock.

您没有指定可以使用哪个框架,但pThreadboost都实现了该模式.