- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以从多个并行线程安全地分配给 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
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
-RTS -N
或
-RTS -N10
, 总是产生
OK
.
关于haskell - 安全并行使用 Haskell 矢量包中的 MVector/IOVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19967421/
有没有办法创建一个参数类型,它表示一个可变长度的异构元组,其中元组的每个元素都是一个 MVector,这样 MVector 可以具有不同的长度,但它们包含相同的数字类型。所以在伪代码中,我想要这样的东
我可以理解为什么MVector类型(来自 vector 包)没有实例化 Foldable类型类? 我想人们经常需要迭代向量。我可以freeze到 Data.Vector然后迭代。但我讨厌改变这些东西,
我可以从多个并行线程安全地分配给 IOVector(来自 Haskell 矢量包)的非重叠索引,还是需要额外的互斥锁? 背景:我想并行运行一组 IO 计算,然后记录所有结果。我首先在列表中返回结果,但
如何构建IOVector来自 MVector ? IOVector 记录为: type IOVector = MVector RealWorld 我有一个如下所示的 MVector,我想构建 IOVe
你将如何为可变数组和向量的各种实现创建一个单一接口(interface),同时保持它的实用性? IE。和: 性能与直接使用数组/向量(无抽象)相当 最少重复代码 像这样的东西: -- (s)torag
我有一个应用程序,它花费大约 80% 的时间使用 Kahan summation algorithm 计算高维向量(dim=100)的大列表(10^7)的质心。 .我已尽力优化求和,但它仍然比等效的
我是一名优秀的程序员,十分优秀!