[英]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.