IORefs,MVars和TVars可用于在并发上下文中包装共享变量.我已经研究了并发haskell一段时间了,现在我已经解决了一些问题.在stackoverflow上搜索并阅读了一些相关问题后,我的问题没有完全解决.
IORef 文档,"将原子性扩展到多个IORefs是有问题的",有人可以帮助解释为什么单个IORef是安全的但不止一个IORef是有问题的吗?modifyMVar是"异常安全,但只有原子,如果没有其他生产者为这个MVar".查看MVar的文档.源代码显示modifyMVar只组成a getMVar和putMVar顺序,表明如果有另一个生产者,它是注意线程安全的.但是如果没有生产者并且所有线程都以" takeMVar然后putMVar"的方式运行,那么简单地使用它是否是线程安全的modifyMVar?为了给出具体情况,我将展示实际问题.我有一些永远不会为空的共享变量,我希望它们是可变状态,因此一些线程可以同时修改这些变量.
好吧,似乎可以TVar清楚地解决所有问题.但我对此并不满意,我渴望得到上述问题的答案.任何帮助表示赞赏.
-------------- re:@GabrielGonzalez BFS界面代码------------------
下面的代码是我使用状态monad的BFS接口.
{-# LANGUAGE TypeFamilies, FlexibleContexts #-}
module Data.Graph.Par.Class where
import Data.Ix
import Data.Monoid
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Monad
import Control.Monad.Trans.State
class (Ix (Vertex g), Ord (Edge g), Ord (Path g)) => ParGraph g where
type Vertex g :: *
type …Run Code Online (Sandbox Code Playgroud)