首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只写互斥锁

只写互斥锁
EN

Stack Overflow用户
提问于 2009-10-21 16:21:02
回答 4查看 4.2K关注 0票数 2

我有一个多线程C++应用程序,它在内存中包含一个复杂的数据结构(缓存数据)。

在我刚读到数据的时候一切都很好。我可以拥有任意多的线程来访问数据。

然而,缓存的结构不是静态的。

  • 如果请求的数据项不可用,它将从数据库中读取,然后插入到数据树中。这也可能没有问题,即使我在向树中添加新数据项时使用互斥项,这只需要几个周期(它只是添加一个指针)。
  • 有一个垃圾收集进程不时地被执行。它从树中移除所有旧项目。要做到这一点,我需要锁定整件事情,以确保目前没有其他进程正在访问将从内存中删除的任何数据。在从缓存中读取时,我还必须锁定树,以便在处理项目时不删除它们(类似于“相反的情况”)。

“伪码”:

代码语言:javascript
复制
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?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-21 16:26:13

调查读写锁

您没有指定可以使用哪个框架,但是pThread助推都实现了该模式。

票数 11
EN

Stack Overflow用户

发布于 2009-10-21 16:32:35

正如其他人所说,这个概念是“共享的读者,单一的作者”锁。在Linux环境中,您应该能够在没有任何框架的情况下使用pthread_rwlock_t。我建议也研究一下boost::shared_lock

票数 4
EN

Stack Overflow用户

发布于 2009-10-21 16:26:40

我建议使用读写器锁。其思想是您可以获得一个用于“阅读”或“写作”的锁,并且该锁将允许多个读取器,但只允许一个作者。非常方便。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1601943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档