为什么MVar不适用于'par`?

vis*_*vis 2 parallel-processing concurrency haskell

只是好奇.如果我有2个线程产生使用forkIO,它们之间的通信可以使用MVar.我想知道在使用并行Haskell的spark时是否同样适用par.我理解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)   
Run Code Online (Sandbox Code Playgroud)

Don*_*art 7

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

不,这不可能.这MVar是一种明确的,非确定性的通信机制,可在手动控制线程时使用.parspark是一个更高级别的抽象,GHC运行时负责为您进行通信.

当您尝试激发IO操作时,没有任何反应,因为引发的操作只能是纯计算.