c - 删除 GWAN KV 存储结构时如何防止竞争条件?

标签 c locking race-condition data-storage g-wan

经过几个月的评估、重新评估和规划不同的数据结构和 Web/应用程序服务器,我现在需要认真研究实现细节。我面临的(目前理论上的)问题是:

假设我正在使用 GWAN KV 存储来存储用户等的 C 结构(工作正常,经过测试),我应该如何从 KV 中删除这些对象,然后从内存中删除,而不遇到竞争条件?

这就是我现在的处境:

线程A:

  • 获取引用要删除的对象的其他对象
  • 将引用设置为 NULL
  • 删除对象

线程B:

  • 尝试获取对象 -> kv 可以返回对象,因为它尚未删除
  • 尝试对对象执行某些操作 -> 可能已在此处删除,因此我可以访问已释放的内存?

或者其他可能发生的事情:

线程B:

  • 获取引用对象的事物
  • 遵循引用 -> 此处可能不会删除对象
  • 做一些引用 -> 对象可能会被删除 -> 问题

线程B:

  • 有一些其他对象可以引用要删除的对象
  • 抓取尚未删除的对象
  • 设置对对象的引用 -> 此处可能会删除对象 -> 问题

除了使用锁之外,有没有办法避免这种情况?我找到了一系列描述处理不同生产者/消费者情况的算法的文档,哈希表,...甚至有时还有等待免费实现(我还没有找到一个很好的例子来向我展示无锁和等待之间的区别-免费,虽然我从概念上理解了它),但我一直无法弄清楚如何处理这类事情。

我是否想得太多了,或者是否有一种简单的方法可以避免所有这些情况?我可以自由地以任何我想要的方式更改数据和存储布局,并且我可以自由地使用处理器特定的指令(例如 CAS)

提前致谢

最佳答案

有几个问题:

deleting a GWAN KV stored struct

当从持久性指针中删除 KV 或释放 KV 时,您必须确保没有人取消引用已释放的数据。

这取决于应用程序。您可以通过使用 G-WAN 内存池引入一些容忍度,只要内存不被覆盖(或池被释放),数据就可以在 KV 删除后幸存下来。

deleting a GWAN KV key-value pair

G-WAN 的 KV 存储进行簿记(使用原子内在函数)来保护线程获取的值,并在处理请求后取消对它们的保护。

如果您需要将数据保留更长时间,请制作副本。

其他存储工具,例如内存 SQLite 使用锁。这种情况下,锁的粒度就非常重要了。

关于c - 删除 GWAN KV 存储结构时如何防止竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453614/

相关文章:

c++ - 带有重复参数的 Scoped_lock

Java 文件锁定

C:Raycaster 不工作

c - sizeof 运算符在以这种方式使用时给出输出 false

c - 在非常大的文件上优化 mmap

c - STDIO锁定: how to check if every flockfile() has been matched by funlockfile()?

c - 如何找到鼠标按钮 'click' 位置 x 和 y?

ruby 简单的竞争条件问题

c# - 竞争条件/TextWriterTraceListener

c - pthread_create() 中是否存在潜在的竞争条件?