簡體   English   中英

Haskell並發IO行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM