中断安全设置扫描

时间:2011-08-31 15:24:26

标签: c algorithm data-structures concurrency

我需要一个满足这些不寻常(AFAIK)要求的数据结构:

  1. 支持的操作是插入(设置,项目),删除(设置,项目)和ForAll(设置,操作)
  2. 插入和删除是罕见的操作。该集合通常只包含一个项目。
  3. 实施必须在C中可行;特别是,没有垃圾收集。
  4. ForAll必须安全地从异步信号处理程序执行,其调用可能已中断插入或删除。
  5. 当然,最后一项要求是杀手锏。我有一个玩具实现,它会在全局链表中引发全局锁定,但如果信号处理程序中断了一个关键部分,那将会死锁。

    (我知道在信号处理程序中执行任何代码的所有问题;出于这个问题的目的,让我们关注如何使ForAll崩溃和死锁安全。中断插入或删除。)

2 个答案:

答案 0 :(得分:6)

如果这些集通常很小,那么在Insert和Delete方法中对列表的线性搜索足够快,那么您可以使用使用compare-and-swap的无锁链表实现。搜索提供了许多解释和示例。

http://www.google.com/search?q=lock+free+linked+list

列表的所有更新都是作为原子操作(比较和交换)完成的,因此中断不会导致问题。

答案 1 :(得分:1)

我确信Jim的方法很好,但是使用小集和不经常的更新,您可能会更乐于实现最简单的软件事务内存。

  1. 阅读指向当前版本结构的指针。
  2. 制作该版本的副本并进行更新。
  3. 更新中的比较和交换。如果CAS失败,请返回步骤1.
  4. 异步扫描很简单 - 读取和继续。如果没有垃圾收集,你需要使用Jim链接的文件中的SafeRead和Release。