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...