[Haskell-cafe] Re: [Haskell] Wait for *either* MVar to be set

Ryan Ingram ryani.spam at gmail.com
Wed Nov 26 16:25:04 EST 2008


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 <isaacdupree at charter.net> 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
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list