繁体   English   中英

为什么MVar不支持`par`?

[英]Why MVar does not work with `par`?

只是好奇。 如果我有2条使用forkIO产生的线程,则可以使用MVar完成它们之间的通信。 我想知道使用par创建的并行Haskell火花时是否同样适用。 我知道par并不会创建实际的线程,而只是指向可以并行发生的某些计算的指针。

下面的代码编译, main引发以下错误: thread blocked indefinitely in an MVar operation

t1 a = putMVar a "Hi"
t2 a = do
  v <- takeMVar a
  print v

main1 = do
  a <- newEmptyMVar
  forkIO (t1 a)
  forkIO (t2 a)

main = do
  a <- newEmptyMVar
  (t1 a) `par` (t2 a)   

我想知道使用par创建的并行Haskell火花时是否同样适用

不,这实际上是不可能的。 MVar是一种明确的,不确定的通信机制,可在手动控制线程时使用。 par spark是更高级别的抽象,GHC运行时在其中为您处理通信。

当您尝试触发IO操作时,什么也不会发生,因为触发的操作只能是纯计算。

据我所知,线程应首先运行takeMVar,然后运行putMVar。 这样,一个线程将阻止其他线程对MVar的访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM