我有一个多线程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?
答案 0 :(得分:10)
答案 1 :(得分:4)
这个概念是“共享阅读器,单一作家”锁,正如其他人所说的那样。在Linux环境中,您应该能够在没有任何框架的情况下使用pthread_rwlock_t
。我建议同时调查boost::shared_lock
。
答案 2 :(得分:3)
我建议reader-writer lock。这个想法是你可以获得“阅读”或“写作”的锁定,锁定将允许多个读者,但只有一个作者。非常方便。
答案 3 :(得分:0)
在C ++ 17中,std::shared_mutex直接支持这种类型的访问(多次读取,一次写入)。我认为这是从boost :: shared_lock采纳的。 Anthony Williams的《 C ++并发行动》中的示例也描述了该主题。 https://livebook.manning.com/book/c-plus-plus-concurrency-in-action-second-edition/chapter-3/185。
基本位是: