gpt4 book ai didi

haskell - 安全并行使用 Haskell 矢量包中的 MVector/IOVector

转载 作者:行者123 更新时间:2023-12-04 08:49:10 24 4
gpt4 key购买 nike

我可以从多个并行线程安全地分配给 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 保存在 MVar 中)以确保一次只进行一次写入?

最佳答案

从代码和评论中的讨论来看,似乎没有理由假设它不是线程安全的。为了支持这一点,这里有一个小测试:

import qualified Data.Vector.Mutable as V
import System.Environment
import Control.Concurrent.Async

thread v i 0 = return ()
thread v i n = do
x <- V.read v i
V.write v i $! x-1
thread v i (n-1)

main = do
[m,n] <- map read `fmap` getArgs
v <- V.replicate m n
tis <- mapM (\i -> async (thread v i n)) [0..m-1]
mapM_ wait tis
r <- mapM (V.read v) [0..m-1]
if all (== 0) r then putStrLn "OK" else putStrLn $ "Not OK: " ++ show r

在这里,即使并行产生了 100 个线程,从 1000000 开始倒数, -RTS -N-RTS -N10 , 总是产生 OK .

关于haskell - 安全并行使用 Haskell 矢量包中的 MVector/IOVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19967421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com