Excerpts from Heka Treep's message of Mon Jan 23 15:11:51 -0500 2012:
> --------------------------------------------------------------------------------
> import Control.Monad.STM
> import Control.Concurrent
> import Control.Concurrent.STM.TChan
> 
> spawn f = do
>   mbox <- newTChanIO
>   forkIO $ f mbox
>   return mbox
> 
> (!) = writeTChan
> 
> actor mbox = do
>   empty <- atomically $ isEmptyTChan mbox
>   if empty
>     then actor mbox
>     else do
>       val <- atomically $ readTChan mbox

Uh, don't you want to combine isEmptyChan and readTChan into
one single atomic action?

>       putStrLn val
>       actor mbox
> 
> test = do
>   mbox <- spawn actor
>   atomically $ mbox ! "1"
>   atomically $ mbox ! "2"
>   atomically $ mbox ! "3"
> 
> -- > test
> -- 1
> -- 2
> -- 3
> --------------------------------------------------------------------------------
> 
> But there are several problems:
> 
> * The @actor@ function is busy checking the channel all the time.

GHC's runtime system is clever. It will block appropriately.

> * Caller and callee need to perform synchronizations (for the @Chan@)
> or atomically transactions (for the @TChan@).

The synchronization for Chan is very cheap, and you would have needed
to synchronize anyway in Erlang (Erlang message queues are not lock free!)

Cheers,
Edward

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to