[Haskell-cafe] Interruptible threads with IO loops

Fedor Gogolev knsd at knsd.net
Wed Dec 21 09:52:12 CET 2011


Hello. I'm trying to get some threads that I can stop and get last
values that was computed (and that values are IO values, in fact).
Here is my first approach:

module Main where

import Control.Concurrent (MVar, threadDelay, forkIO, newMVar,
putMVar, readMVar)

tick :: Int -> IO Int
tick v = return $ v + 1

loop :: MVar Bool -> a -> (a -> IO a)  -> IO a
loop var init loopfun = do
   next <- loopfun init
   shouldStop <- readMVar var
   case shouldStop of
       True -> return next
       False -> loop var next loopfun

runLoop :: Int -> IO ()
runLoop timeout = do
   var <- newMVar False
   forkIO $ threadDelay timeout >> putMVar var True
   value <- loop var 0 tick
   print value

main :: IO ()
main = runLoop 30000000

The problem is that it looks a little messy and what's worse it leaks
memory. So I'm wondering if there is a better approach to do so or
some fix to memory leak.



More information about the Haskell-Cafe mailing list