「ソフトウェアトランザクショナルメモリ」の版間の差分

削除された内容 追加された内容
タグ: 差し戻し済み
タグ: 差し戻し済み
28行目:
}}
 
STM においては、この問題は単純に解決できる。あるトランザクション中における2つの操作を単にラップしてアトミックな操作としてくっつけてしまえばよいのである。唯一の突っ込み所としてはこの処理を呼び出す側からははっきりしないことがある所である。つまり、コンポーネントが提供する方法の実装の詳細や、もし操作が失敗した場合に、そのトランザクションが再実行を試みるタイミングである。それに対して、筆者は '''<code>retry'''</code> コマンドを提案している。これは、トランザクションが失敗したときに生成されるトランザクションログを使って、どのメモリセルが読み出されたかを決定するものである。そして、これらのメモリセルのうちの一つが変更された時に自動的にトランザクションをリトライする。これは、少なくともある一つの値が変化するまでは、トランザクションの振る舞いは変わらないだろうという考えに拠っている。
 
筆者はまた、操作を合成するための代替手段を提案している。これは <code>orElse</code> というキーワードである。これは一つのトランザクションが走っていて、そのトランザクションが <code>retry</code> するならば、もう一方が実行されるというものである。もし両方リトライするならば、関連する変更がなされたらすぐに両方ともリトライしようとする。この機能は、[[POSIX]]のネットワークで使われる <code>select()</code> 呼び出しの特徴と比較される。<cocde>orElse</code> を使えば、呼び出し側は複数のイベントのうちどれか一つが変化するのを同時に待つことができる。この機能はまた[[インタフェース (情報技術)|プログラミングインタフェース]]を単純化できる。例えば、同期操作および非同期操作を相互に変換する機構を単純に作ることができる。