Threads and concurrency primitives
One of the basic forms of concurrent programming involves sharing read-write data between threads. Usually data is shared via references. From fastest to most flexible, the three types of mutable references in Haskell are IORef, MVar, and STM. All three can be used, at least to some extent, in a thread-safe manner. We start our concurrent journey with a simple reference, IORef, and work our way to arbitrarily complex transactions using STM.
Threads and mutable references
The most basic reference type in Haskell is IORef. The core IORef API is compact, one datatype and a few atomic operations:
module Data.IORef data IORef a newIORef :: a → IO (IORef a) readIORef :: IORef a → IO a writeIORef :: IORef a → a → IO () modifyIORef :: IORef a → (a → a) → IO () atomicModifyIORef :: IORef a → (a → (a, b)) → IO b
IORef is always full, that is, there is always a value to be read without blocking. They're just simple mutable references. IORef is very fast. They're the...