Mercurial > hg > Papers > 2014 > toma-master
diff paper/chapter2.tex @ 65:d15c924e9089
fix
author | Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 12 Feb 2014 21:08:01 +0900 |
parents | 13535fc08357 |
children |
line wrap: on
line diff
--- a/paper/chapter2.tex Wed Feb 12 20:00:15 2014 +0900 +++ b/paper/chapter2.tex Wed Feb 12 21:08:01 2014 +0900 @@ -71,7 +71,20 @@ STM を利用することでロック忘れによる競合状態や, デッドロックといった問題から解放される. STM は, STM モナドという特殊なモナドの中でのみ変更できる. -STM モナドの中で変更したアクションのブロックを atomically コンビネータを使ってトランザクションとして実行する(atomically コンビネータを用いることで IO モナドとして返されるため, I/O操作が可能となる). +STMの関数が持つ型をソースコード\ref{src:stm}に示す. + +\begin{lstlisting}[label=src:stm, caption=STMの関数] +newTVar :: a -> STM (TVar a) +readTVar :: TVar a -> STM a +writeTVar :: TVar a -> a -> STM () + +atomically :: STM a -> IO a +\end{lstlisting} + +TVar というのは, Transactional variablesの略で, STM で管理する変数に対して利用する. + +新たにSTMで管理する変数を作成するnewTVar, 変数から値を読み込むreadTVar, 変数へ値を書き込むwriteTVarが存在する. +これらの関数をSTM モナドの中で使い単一のアクションのブロックとしてまとめ, atomically コンビネータを使ってトランザクションとして実行する(atomically コンビネータを用いることで IO モナドとして返されるため, I/O操作が可能となる). いったんブロック内に入るとそこから出るまでは, そのブロック内の変更は他のスレッドから見ることはできない. こちら側のスレッドからも他のスレッドによる変更はみることはできず, 実行は完全に孤立して行われる. トランザクションから出る時に, 以下のことが1つだけ起こる.