2010-08-15 4 views
4

하스켈의 동시성을보다 깊이있게 이해하려고합니다. 이런 일이 왜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를 사용하는 것은 나쁘다.

+1

관련 : http://stackoverflow.com/questions/2981984/ – sdcvvc

+0

문제는 주 스레드가 이전에 자식 스레드로 끝났습니다. 모든 자식 스레드가 대기 할 경우 겹침이 나타나지 않습니다. – Anton

+0

또한,'print' ='putStrLn.show'입니다. 'print.show'는'show'를 두 번 호출합니다. 이것은 약간 중복됩니다. – jrockway

답변

4

때때로 내가 인쇄 작업이 표준 출력에 대한 잠금이 있기 때문에 출력은 가끔 겹치는

겹치는 것을 알 수있다. 각 스레드는 "print"를 호출하여 문자 하나를 쓰려고 시도하고 각 문자를 잠급니다. Haskell의 선점 동시성으로 인해 스레드 인쇄의 무작위 인터리빙이 표시됩니다.

바람직하지 않은 동작 인 경우 각 스레드가 인쇄하고자하는 문자열을 프린터 스레드로 보내고 차례대로 줄 단위로 출력합니다.

+0

나는 당신이 다른 스레드에서 각 문자를 stdout 인쇄 아웃 haskell 이해합니까? 내가 맞습니까? – Anton