| | 72 | The implementation is based on STM, because that enables `waitAny` and `waitBoth` to be implemented very straightforwardly. Without STM these operations would require extra threads, and would be hard to get right. Using STM also means that users can compose async operations with their own STM operations. |
| | 73 | |
| | 74 | The `concurrently`, `race`, and `race_` functions are implemented using threads and `MVar` for performance (there is a commented-out STM version in the code and documentation to give the semantics). The benchmark demonstrating the difference is in `bench/race.hs`; it runs about 30% faster with the `MVar` version. |
| | 75 | |
| | 76 | Should cancel be synchronous or asynchronous? (I addressed this [http://www.haskell.org/pipermail/libraries/2012-June/017920.html here]). |