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

时间:2013-07-03 16:41:06

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

经过几个月的评估和重新评估和规划不同的数据结构和Web /应用程序服务器之后,我现在正处于需要了解实施细节的地步。我正面临的(目前理论上)问题是:

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

这就是我现在所处的目标:

主题A:

  • 抓住引用要删除的对象的其他对象
  • 设置对NULL的引用
  • 删除对象

主题B:

  • 尝试获取对象 - > kv可以返回对象,因为它尚未删除
  • 尝试对象做一些事情 - >可以在这里删除,所以我会访问已经释放的内存吗?

或其他可能发生的事情:

主题B:

  • 获取引用对象的东西
  • 关注参考 - >这里可能没有删除对象
  • 做参考的事情 - >此处可能会删除对象 - >问题

主题B:

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

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

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

提前致谢

1 个答案:

答案 0 :(得分:0)

那里有几个问题:

  

删除GWAN KV存储结构

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

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

  

删除GWAN KV键值对

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

如果您需要保留较长时间的数据,请复制。

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