Concurrent Haskell

From Wikipedia, the free encyclopedia

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.

[edit] 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 MVars in favour of TVars.
  • introduces the retry and orElse primitives, allowing alternative atomic actions to be composed together.

[edit] References:

  1. ^ 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.)
  2. ^ The Haskell Hierarchical Libraries, Control.Concurrent
  3. ^ 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.
  4. ^ Control.Concurrent.STM