10章ソフトウェアトランザクショナルメモリ

ソフトウェアトランザクショナルメモリ(STM)は、複数の状態変更操作をグループ化し単一の不可分操作として実行できるようにすることで、並行プログラミングを単純にする技法です。厳密に言えば、「ソフトウェアトランザクショナルメモリ」は実装技法であり、言語の機能としては「不可分に実行されるコード片」と呼ぶべきです。残念ながら前者の用語が定着しているので、言語のこの機能をSTMと呼びます。

STMは、伝統的な並行機構がかかえる多くの問題を解決します。以降では、例を挙げながら問題解決の方法を説明します。読み進めるときの参考として、STMインタフェースの型と操作を以下に挙げておきます。

Control.Concurrent.STM

data STM a -- 抽象データ型
instance Monad STM -- 特に重要

atomically :: STM a -> IO a

data TVar a -- 抽象データ型
newTVar   :: a -> STM (TVar a)
readTVar  :: TVar a -> STM a
writeTVar :: TVar a -> a -> STM ()

retry     :: STM a
orElse    :: STM a -> STM a -> STM a

throwSTM  :: Exception e => e -> STM a
catchSTM  :: Exception e => STM a -> (e -> STM a) -> STM a

10.1 ウィンドウマネージャの例

複数のデスクトップを管理するウィンドウマネージャを想像してみましょう。ユーザは1つのデスクトップから別のデスクトップへウィンドウを移動できます。同時にプログラムは自身のウィンドウを現在のデスクトップから別のデスクトップに動かすよう要求できます。このウィンドウマネージャは複数のスレッドを使います。1つのスレッドでユーザからの入力を受け付け、複数のスレッドがウィンドウで走るプログラムからの要求を受け付けます。そして、1つのスレッドでユーザのディスプレイへ描画します。 ...

Get Haskellによる並列・並行プログラミング now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.