0

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

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

这就是我目前的情况:

线程 A:

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

线程 B:

  • 尝试获取对象-> kv 可以返回对象,因为它尚未被删除
  • 尝试对对象做某事-> 此处可能已被删除,所以我将访问已释放的内存?

或其他可能发生的事情:

线程 B:

  • 获取事物引用对象
  • 关注参考 -> 对象可能不会在此处删除
  • 做一些参考 -> 对象可能会在这里被删除 -> 问题

或者

线程 B:

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

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

我是不是想多了,还是有一种简单的方法可以避免所有这些情况?我可以随意更改数据和存储布局,并且可以自由使用处理器特定指令(例如 CAS)

提前致谢

4

1 回答 1

0

那里有几个问题:

删除 GWAN KV 存储结构

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

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

删除 GWAN KV 键值对

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

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

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

于 2013-07-04T11:41:36.310 回答