- 在列表末尾插入 - 从列表开头删除 - 根据指向要删除成员的指针,在列表中任意位置删除成员,该指针通过遍历列表之外的其他途径获得。
所以也许更好地描述这个数据结构的方式是具有从队列/先进先出中间删除项目的可能性。
是否有标准方法来同步这个数据结构?我卡在了潜在死锁问题上,其中一些可能与涉及的算法本身有关,另一些可能源于我试图在一个有其他限制的受限空间中工作。
特别是,如果要同时删除相邻对象,我就卡住了。显然,在删除对象时,你需要获取先前和下一个对象在列表中的锁,并更新它们的next/prev指针以相互指向。但如果任何一个邻居已经被锁定,这将导致死锁。我试图找出任何/所有正在进行的删除操作都可以遍历锁定的列表部分,并确定当前正在删除的最大子列表,然后锁定相邻于该子列表的节点,以便将整个子列表作为一个整体被删除,但我的头有点疼.. :-P
结论(?):跟进一下,我确实有一些要使代码工作的代码,但我也对理论问题感兴趣。每个人的答案都非常有帮助,再加上在这里未明确表达的限制细节(你真的不想知道指向要删除元素的指针来自哪里和其中涉及的同步!),我已决定暂停使用本地锁代码并专注于:
- 使用更多小列表,每个列表都有单独的锁。 - 最小化在保持锁定期间执行指令的数量,并在获取锁定之前(以安全的方式)调用内存,以减少页面故障和缓存未命中的可能性。 - 测试在人为高负载下的争用情况,并评估此方法是否令人满意。
再次感谢给出答案的所有人。如果我的实验效果不好,我可能会回到概述的方法(特别是Vlad的方法)并重试。