In fact: > import Control.Concurrent.STM > import Control.Concurrent.STM.TMVar
> -- gets a value from one of a list of TMVars > takeTMVars :: [TMVar a] -> STM (TMVar a, a) > takeTMVars = foldr fetch retry where > fetch v act = (takeTMVar v >>= \a -> return (v, a)) `orElse` act > -- puts the given value into exactly one of a list of TMVars > putTMVars :: [TMVar a] -> a -> STM (TMVar a) > putTMVars vs a = foldr put retry vs where > put v act = (putTMVar v a >> return v) `orElse` act -- ryan On Wed, Nov 26, 2008 at 11:41 AM, Isaac Dupree <[EMAIL PROTECTED]> wrote: > Peter Verswyvelen wrote: >> >> ... by spawning and killing two threads (which might be an expensive >> operation, I'm not sure) > > pretty cheap in GHC -- they're not system threads > >> Am I wrong in this? If so, is this something that might be considered as a >> future enhancement in the GHC libraries and runtime? > > Also, look at STM (e.g. TVars), which is designed to do what you want more > directly, I think. > > (timeouts might still use the GHC-thread thing. Don't worry about its > performance unless you're measurably suffering from it...) > > -Isaac > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
