[Haskell-cafe] Does the TMVar and TChan really obey STM rules?

Svein Ove Aas svein.ove at aas.no
Thu Dec 24 16:54:53 EST 2009


On Thu, Dec 24, 2009 at 4:03 PM, Andrey Sisoyev
<Andrejs.Sisojevs at nextmail.ru> wrote:
>
> Hi everyone,
>
>>isEmptyTMVar :: TMVar a -> STM Bool    Source
>>
>>Check whether a given TMVar is empty.
>>
>>Notice that the boolean value returned is just a snapshot
>>of the state of the TMVar. By the time you get to react on its result,
>>the TMVar may have been filled (or emptied) - so be extremely careful
>>when using this operation. Use tryTakeTMVar instead if possible.
>
> When I read this in the haddock to Control.Concurrent.STM.TMVar, I started
> to suspect that the behavior of TMVar and TChan might be worse than I
> imagined.
>
That looks like it was copied and pasted from the MVar documentation.
It's not in the least correct; in fact, TMVar a is implemented as TVar
(Maybe a), so it is just as atomic.

> Few questions on TMVar and TChan:
> (1) If 2 threads are sleeping-waiting for the output of TChan, and it gets
> filled, do they both wakeup, or just one?

You will only see one react. It's just about possible that both in
fact wake, but one will go back to sleep; the abstraction doesn't
leak.

> (2) Similar question about reading/writing TMVar.

Same answer.

> (3) If a thread is sleeping-waiting for the output of TChan, but transaction
> wants to restart due to the change in any of touched TVar, then does the
> thread wakeup and restart the transaction?

If an STM transaction blocks, the runtime keeps track of all cells
(TVars) that have been read until the point in the transaction at
which it called retry, and restarts it - from the beginning - if any
of them change.

This could be optimized. It may even have been optimized. But tose are
the semantics; it'll behave like that's true.

> (4) Similar question about TMVar.
>
It's all implemented by TVars, so all your questions are about those.

-- 
Svein Ove Aas


More information about the Haskell-Cafe mailing list