하스켈의 동시성을보다 깊이있게 이해하려고합니다. 이런 일이 왜Haskell 동시성 IO 동작
*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>
이해가 안 : (두 번째 호출을보고)
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()
가 가끔 인쇄 작업이 겹치는 것을보고 내가 추적 결과를 얻을 : 나는 다음과 같은 코드가 있습니다 . [1..9]
에 대한 MVar를 사용하는 것은 나쁘다.
관련 : http://stackoverflow.com/questions/2981984/ – sdcvvc
문제는 주 스레드가 이전에 자식 스레드로 끝났습니다. 모든 자식 스레드가 대기 할 경우 겹침이 나타나지 않습니다. – Anton
또한,'print' ='putStrLn.show'입니다. 'print.show'는'show'를 두 번 호출합니다. 이것은 약간 중복됩니다. – jrockway