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

时间:2012-07-05 19:03:03

标签: haskell concurrency parallel-processing

好奇。如果我使用forkIO生成2个线程,则可以使用MVar进行通信。我想知道使用par创建并行Haskell的spark时是否同样适用。我理解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)   

2 个答案:

答案 0 :(得分:7)

  

我想知道使用par

创建并行Haskell的spark时是否同样适用

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

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

答案 1 :(得分:0)

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