[英]Haskell concurrency IO behavior
我試圖更深入地理解Haskell中的並發性。 我有以下代碼:
import Control.Concurrent
main :: IO ()
main = do
arr <- return $ [1..9]
t <- newMVar 1
forkIO (takeMVar t >> (print.show) arr >> putMVar t 1)
forkIO (takeMVar t >> (print.show) arr >> putMVar t 1)
forkIO (takeMVar t >> (print.show) arr >> putMVar t 1)
forkIO (takeMVar t >> (print.show) arr >> putMVar t 1)
forkIO (takeMVar t >> (print.show) arr >> putMVar t 1)
return ()
有時我看到打印操作重疊,我得到了跟隨結果(看第二個調用):
*Main Control.Concurrent> :l test.hs
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main Control.Concurrent> main
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
*Main Control.Concurrent> main
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
"[1,2,3,4,5,6,7,8,9]"
["[1,2,3,4,5,6,7,8,9]"
?"[1,2,3,4,5,6,7,8,9]"
1h*Main Control.Concurrent>
我不明白為什么會這樣。 使用[1..9]
的MVar也很糟糕。
有時我看到打印操作重疊
輸出有時會重疊,因為標准輸出有鎖定。 每個線程調用“print”,它嘗試寫出一個字符,為每個字符取鎖。 由於Haskell的搶占式並發性,您將看到線程打印的隨機交錯。
如果這是不合需要的行為,則讓每個線程將其希望打印的字符串發送到打印機線程,然后打印機線程將按順序逐行輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.