2

只是好奇。如果我有 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)   
4

2 回答 2

7

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

不,这真的不可能。这MVar是一种显式的、非确定性的通信机制,用于手动控制线程时使用。parsparks 是一个更高级别的抽象,GHC 运行时为您处理通信。

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

于 2012-07-05T19:19:13.010 回答
0

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

于 2012-07-07T14:37:57.157 回答