Concurrent Haskell
Concurrent Haskell extends[1] Haskell 98 with explicit concurrency. The two main concepts underpinning Concurrent Haskell are:
- A primitive type
MVar α
implementing a bounded/single-place asynchronous channel, which is either empty or holds a value of typeα
. - The ability to spawn a concurrent thread via the
forkIO
primitive.
Built atop this is a collection of useful concurrency and synchronisation abstractions[2] such as unbounded channels, semaphores and sample variables.
Default Haskell threads have very low overheads: creation, context-switching and scheduling are all internal to the Haskell runtime. Fully-fledged operating system processes are nevertheless available through the forkOS
primitive on supported architecture and operating system combinations.
Software Transactional Memory
The recently introduced Software Transactional Memory (STM)[3] extension[4] to the Glasgow Haskell Compiler reuses the process forking primitives of Concurrent Haskell. STM however:
- eschews
MVar
s in favour ofTVar
s. - introduces the
retry
andorElse
primitives, allowing alternative atomic actions to be composed together.
References:
- ^ Simon Peyton Jones, Andrew Gordon, and Sigbjorn Finne. Concurrent Haskell. ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (PoPL). 1996. (Some sections are out of date with respect to the current implementation.)
- ^ The Haskell Hierarchical Libraries, Control.Concurrent
- ^ Tim Harris, Simon Marlow, Simon Peyton Jones, and Maurice Herlihy. Composable Memory Transactions. ACM Conference on Principles and Practice of Parallel Programming 2005 (PPoPP'05). 2005.
- ^ Control.Concurrent.STM