IORef
s,MVar
和TVar
可用于在并发上下文中包装共享变量。我已经研究了并发haskell一段时间了,现在我已经解决了一些问题。在stackoverflow上搜索并阅读了一些相关问题后,我的问题没有完全解决。
IORef
documentation,“将原子性扩展到多个IORefs是有问题的”,有人可以帮助解释为什么单个IORef
是安全的但不止一个{{1有问题吗?IORef
是“异常安全的,但只有在没有其他生产者用于此MVar时才是原子的”。请参阅modifyMVar
的{{3}}。源代码显示MVar
仅按顺序组成modifyMVar
和getMVar
,表示如果有另一个制作人,则说明它是线程安全的。但是如果没有生产者并且所有线程都以“putMVar
然后takeMVar
”的方式运行,那么简单地使用putMVar
是否可以线程安全?为了具体说明,我将展示实际问题。我有一些从不为空的共享变量,我希望它们是可变状态,因此一些线程可以同时修改这些变量。
好的,似乎modifyMVar
清楚地解决了所有问题。但我对此并不满意,我渴望得到上述问题的答案。任何帮助表示赞赏。
-------------- re:@GabrielGonzalez BFS界面代码------------------
以下代码是我使用状态monad的BFS界面。
TVar
答案 0 :(得分:5)
现代处理器提供比较和交换指令,以原子方式修改单个指针。我希望如果你追踪得足够深,你会发现这条指令是用来实现atomicModifyIORef
的指令。因此,很容易为单个指针提供原子访问。但是,由于没有对多个指针的硬件支持,因此无论您需要什么都必须在软件中完成。这通常涉及在所有线程中发明并手动执行协议 - 这很复杂且容易出错。
是的,如果所有主题同意仅使用“单takeMVar
后跟单putMVar
”行为,则modifyMVar
是安全的。