2

ちょっと興味があるんだけど。を使用して 2 つのスレッドを生成した場合forkIO、それらの間の通信は を使用して行うことができますMVar。を使用して作成された並列 Haskell の spark を使用する場合にも同じことが適用されるのだろうかparpar実際のスレッドを作成するのではなく、並行して発生する可能性のある計算へのポインターを作成することを理解しています。

次のコードをコンパイルすると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

パーを使用して作成された並列ハスケルのスパークを使用する場合にも同じことが当てはまるのだろうか

いいえ、これは実際には不可能です。はMVar、スレッドを手動で制御するときに使用する、明示的で非決定的な通信メカニズムです。parスパークははるかに高いレベルの抽象化であり、GHCランタイムが通信を処理します。

スパークされたアクションは純粋な計算のみである可能性があるため、IOアクションをスパークしようとしても何も起こりません。

于 2012-07-05T19:19:13.010 に答える
0

私の知る限り、スレッドは最初に takeMVar を実行し、次に putMVar を実行する必要があります。このようにして、スレッドは他のスレッドによる MVar へのアクセスをブロックします。

于 2012-07-07T14:37:57.157 に答える