好奇。如果我使用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)
答案 0 :(得分:7)
我想知道使用par
创建并行Haskell的spark时是否同样适用
不,这不太可能。 MVar
是一种明确的,非确定性的通信机制,可在手动控制线程时使用。 par
sparks是一个更高级别的抽象,GHC运行时负责为您进行通信。
当您尝试引发IO操作时,没有任何反应,因为引发的操作只能是纯计算。
答案 1 :(得分:0)
据我所知,一个线程应首先运行takeMVar,然后运行putMVar。这样,线程就会阻止其他线程访问MVar。