2012-07-05 87 views
2

只是好奇。如果我有使用forkIO產生的2個線程,它們之間的通信可以使用MVar來完成。我不知道在使用使用par創建的並行Haskell的火花時是否同樣適用。據我所知,par不會創建實際的線程,而只是指向可以並行發生的某些計算的指針。爲什麼MVar不能與`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) 

回答

7

I wonder if the same apply when using parallel Haskell's spark created using par

不,這不是真的有可能。 MVar是手動控制線程時使用的顯式非確定性通信機制。 par火花是一個更高層次的抽象,GHC運行時爲您處理通訊。

當您嘗試觸發IO操作時,沒有任何反應,因爲觸發的操作只能是純計算。

+0

謝謝。只是引發行動的部分可以是純粹的幫助! :) – vis 2012-07-05 20:26:48

+0

此外,即使你在spark中的unsafePerformIO,火花不會充當垃圾收集的根源,並且可能會被丟棄,所以檢查完全在其權限範圍內,找不到潛在的作者。 – 2012-07-05 21:23:39

0

據我所知,一個線程應該首先運行takeMVar,然後putMVar。這樣,一個線程阻止其他線程訪問MVar。

+0

我不認爲這是正確的。考慮你有2個線程,'t1'用'putMVar'和't2'填充到'MVar'中,用'takeMVar'從中讀取。如果't1'先運行,它不會被阻塞,因爲變量是空的,'t2'也不會。現在,如果't2'首先運行,它會被阻塞,但當't1'放入變量時將被阻塞。所以,哪一個先運行應該無關緊要。無論哪個人發現自己被阻擋,它都會等到它被解鎖。 – vis 2012-07-07 21:25:48

+0

嗯,確實.... – 2012-07-07 22:45:49

相關問題