【发布时间】:2010-08-15 07:17:48
【问题描述】:
我正在尝试更深入地了解 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] 也很糟糕。
【问题讨论】:
-
问题是主线程比子线程更早完成。如果我们将等待所有子线程没有重叠出现。
-
另外,
print=putStrLn.show。print.show调用show两次,有点多余。
标签: haskell concurrency io