我正在 Haskell 中寻找共享并发向量,所以我会接受一个指向性能解决方案的答案,而不是我在这里讨论的解决方案,即将向量库与 stm 或 atomic-primops 相结合。
我有两个线程共享一个可变向量 ( Data.Vector.Mutable.IOVector
) 和一些可以原子地切换一次的标志(例如,TVar
使用 stm 或IORef
atomic-primops)。线程 1 可以在原子地切换标志之前或之后写入向量(非原子地),线程 2 可以在检查标志是否已切换之前或之后从向量中读取。
具体来说,这里有一些最小的例子。是否存在导致他们评估的数据竞赛undefined
?
- 使用 STM 的示例:http: //lpaste.net/362596
- 使用 atomic-primops 的示例:http: //lpaste.net/362595
更一般地说,标志上原子操作的相对顺序是否意味着向量上的操作之间存在某种顺序?特别是,我想知道以下是否属实:
- 如果检查发生在切换之前,则检查之前的读取无法看到切换之后的写入。
- 如果检查发生在切换之后,那么检查之后的读取必须看到切换之前的写入。
在 atomic-primops 的情况下,我特别怀疑使用readIORef
/ readForCAS
,因为文档说它并不意味着任何障碍。