我需要一个满足这些不寻常(AFAIK)要求的数据结构:
当然,最后一项要求是杀手锏。我有一个玩具实现,它会在全局链表中引发全局锁定,但如果信号处理程序中断了一个关键部分,那将会死锁。
(我知道在信号处理程序中执行任何代码的所有问题;出于这个问题的目的,让我们关注如何使ForAll崩溃和死锁安全。中断插入或删除。)
答案 0 :(得分:6)
如果这些集通常很小,那么在Insert和Delete方法中对列表的线性搜索足够快,那么您可以使用使用compare-and-swap的无锁链表实现。搜索提供了许多解释和示例。
http://www.google.com/search?q=lock+free+linked+list
列表的所有更新都是作为原子操作(比较和交换)完成的,因此中断不会导致问题。
答案 1 :(得分:1)
我确信Jim的方法很好,但是使用小集和不经常的更新,您可能会更乐于实现最简单的软件事务内存。
异步扫描很简单 - 读取和继续。如果没有垃圾收集,你需要使用Jim链接的文件中的SafeRead和Release。