아주 간단한 예제음.. 그런데 채널 이니 세마포어니 하는 것들도 보이네. 채널은 아예 프로듀서-컨슈머 모델인거 같고. 뭐가 어떤 용도로 쓰이는지 더 공부해야 하겠군. 사실 요 MVar 를 어떻게 써야 잘 쓰는건지 잘 안그려진다...펼쳐두기..
또다른 예제. () 를 넣어서 값 자체는 의미없이 이벤트처럼 써먹었다.펼쳐두기..
다음번 haskell 공부는 언제가 될지 헐.
헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤
아주 간단한 예제음.. 그런데 채널 이니 세마포어니 하는 것들도 보이네. 채널은 아예 프로듀서-컨슈머 모델인거 같고. 뭐가 어떤 용도로 쓰이는지 더 공부해야 하겠군. 사실 요 MVar 를 어떻게 써야 잘 쓰는건지 잘 안그려진다...펼쳐두기..
-- 희한하구먼. 문서상에도 나와있듯이 MVar 는 그냥 박스라고 생각하면
-- 된다. 다형성 타입이니 어떤 타입이건 담을수 있고 이 박스에서 값을
-- 꺼내거나 넣는 액션이 동기화 가능하다. 아래는 foo 쓰레드가 값을
-- 채우고 bar 쓰레드가 값을 꺼내가는 예제.
import Control.Concurrent
main = do
buf <- newEmptyMVar
foo <- forkIO $ threadFoo buf
bar <- forkIO $ threadBar buf
threadDelay 1000000000
threadFoo buf = do
threadDelay 500
putMVar buf 1
threadFoo buf
threadBar buf = do
v <- takeMVar buf
print v
threadBar buf
또다른 예제. () 를 넣어서 값 자체는 의미없이 이벤트처럼 써먹었다.펼쳐두기..
-- 음. MVar 를 이용해서 쓰레드가 끝나는 시점을 잡아봤다. 걍 간단히 원래
-- 받은 fun 을 forkIO 에 넘기기 전에 빈 Mvar 를 만들고 fun 실행후 이
-- MVar 에 () 을 채우는 중간 함수를 만들어서 이 중간 함수를 forkIO 에
-- 넘기도록 했다. haskell 문서상에는 비슷하지만 더 나은 예가 있던데
-- 예외는 아직 공부를 안해서 안 읽어봤다.
--
-- 아래코드는 당연히 걍 예제. thread 도 리턴 안하고 중간에 먹어버리는등
-- 문제 많은 코드. 음 common lisp 이라면 걍 멀티플 밸류로 넘겨버릴텐데
-- haskell 에서 튜플로 넘기면 받을때 귀찮아서 그냥 thread 는
-- 버려버렸다. common lisp 의 멀티플 밸류가 그립군?
import Control.Concurrent
-- 음 아래 guarded_fun 은 compose 나 closure 로 좀더 멋지게 작성이
-- 가능할거 같은데.. 좀 보기 흉하구먼.
fork fun = do
mvar <- newEmptyMVar
thread <- forkIO $ guarded_fun mvar
return mvar
where guarded_fun mvar = do
fun
putMVar mvar ()
join mvar = do
takeMVar mvar
print "joined"
main = do
mv <- fork thread
join mv
thread = do
threadDelay 5000000
print "done"
댓글 2개:
하스켈 넘 복잡하지 않나요? ㅜㅜ ㅎㅎ;
@네글자군 - 2008/12/12 20:09
네.. haskell 정말 어렵네요. 지금껏 써오던 다른 언어들이랑 너무 달라서.. 아직 맛뵈기로 조금씩만 공부하는 중이지만 좀더 공부를 해도 haskell 스타일의 코드를 뽑아내긴 영 힘들것 같다는 생각이.. ㅎㅎㅎ
댓글 쓰기