我试图更深入地了解 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>
我不明白为什么会发生这种情况。将 MVar 用于 [1..9]
效果也不好。
最佳答案
Sometimes i see that the print operations overlaps
输出有时会重叠,因为标准输出上存在锁定。每个线程调用“print”,它尝试写出一个字符,并为每个字符获取锁定。由于 Haskell 的抢占式并发,您将看到线程打印的随机交错。
如果这是不良行为,则让每个线程将其希望打印的字符串发送到打印机线程,然后打印机线程将依次执行逐行输出。
关于Haskell 并发 IO 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486549/