【发布时间】:2011-01-21 01:20:42
【问题描述】:
我正在寻找符合以下要求的无锁设计:
- 单一写入器写入结构,单一读取器从该结构中读取(该结构已经存在并且可以安全地同时读取/写入)
- 但在某些时候,结构需要由编写器更改,然后它会初始化、切换并写入一个新结构(相同类型但具有新内容)
- 并且在下次阅读器读取时,它切换到这个新结构(如果写入器多次切换到一个新的无锁结构,阅读器丢弃这些结构,忽略它们的数据)。
- 必须重复使用这些结构,即在写入/读取/切换操作期间不允许堆内存分配/释放,以实现 RT 目的。
我目前已经实现了一个包含这些结构的多个实例的环形缓冲区;但是这个实现的缺点是,当编写者使用了环形缓冲区中存在的所有结构时,就没有更多的地方可以改变结构了……但是环形缓冲区的其余部分包含一些不必读取的数据由读者使用,但作者不能重复使用。因此,环形缓冲区不适合此目的。
任何想法(名称或伪实现)无锁设计?感谢您考虑这个问题。
【问题讨论】:
-
过分强调没有重点。
-
@KennyTM:你是对的。已编辑。
-
好问题。这是实时系统中的常见问题。我很好奇是否有现成的方法可以做到这一点。
-
您需要读/写原子数据。就像交易一样,我说的对吗?然后您必须使用一些同步原语来保证原子数据访问。您需要结构和函数的两个实例,例如 TryLock。如果你愿意,我可以描述更多。
-
TryLock 不被允许:在 writer 中,新数据绝对不能被丢弃,以防万一失败。
标签: multithreading real-time lock-free