[Haskell-cafe] Concurrency question

Dmitry V'yal akamaus at gmail.com
Tue Sep 6 02:34:24 EDT 2005


> I believe you're just observing lazy evaluation at work.  The IO 
> computation that you're forking is (return $ resolve cnf).  `resolve` is 
> a pure function.  Hence the forked computation succeeds immediately--and 
> the thread terminates (successfully)--without evaluating (resolve cnf).  
> It isn't until the case arm that begins "Just (ans, stats) ->" that the 
> result of (resolve cnf) is demanded and hence evaluation of (resolve 
> cnf) begins.  But this is too late for the timeout to have the intended 
> effect.
> 
> How to fix?  You need to demand (enough of) the result of (resolve cnf) 
> before returning from the IO computation.  What "enough of" means 
> depends on how `resolve` is written.  You may find the DeepSeq module I 
> wrote (see 
> http://www.mail-archive.com/haskell@haskell.org/msg15819.html) helpful.
> 
> Dean

I've just tried DeepSeq as you proposed.

 >timeout :: DeepSeq a => Int -> IO a -> IO (Maybe a)
 >timeout n t = do res <- par_io timer thr  --timer
 >                 return res
 >    where thr = do res <- t
 >                   return $!! Just res
 >          timer = do threadDelay n
 >                     return Nothing

All works perfectly now! From now I'll pay more attention to evaluation order.

Thank you for your help and attention.


More information about the Haskell-Cafe mailing list