我可以从多个并行线程安全地分配给 IOVector(来自 Haskell 矢量包)的非重叠索引,还是需要额外的互斥锁?
背景:我想并行运行一组 IO 计算,然后记录所有结果。我首先在列表中返回结果,但这似乎是错误的数据结构。所以我希望使用矢量包中的 IOVector 来存储结果。
我的问题是,我可以写类似的东西:
runPar :: [IO a] -> IO (IOVector a)
runPar tasks = do
v <- new (length tasks)
mapM forkIO [task >>= write v i | (i, task) <- zip [0..] tasks]
-- Wait for all tasks to complete
return v
这能保证安全吗?或者我是否需要一个类似互斥锁的控件(例如将 v 保存在 an 中MVar
)以确保一次只进行一次写入?