提案されている言語側のサポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/05 03:33 UTC 版)
「ソフトウェアトランザクショナルメモリ」の記事における「提案されている言語側のサポート」の解説
STM は概念的に単純なため、プログラマは比較的単純な文法で STM を使うことができる。Tim Harris と Keir Fraser は論文"Language Support for Lightweight Transactions"で、古典的な「条件つき排他領域」(conditional critical region, CCR) を使ってトランザクションを表現するアイデアを提示した。CCR の最も単純な形式は、「アトミック・ブロック」というものである。これは論理的には"一瞬"に実行されるコードブロックと考えることができる。 // Insert a node into a doubly-linked list atomically atomic { newNode->prev = node; newNode->next = node->next; node->next->prev = newNode; node->next = newNode; } ブロックの最後に到達すると、トランザクションは可能ならコミットし、さもなくばアボートして再実行(リトライ)される。CCR はまたガード条件を設定することを許しており、するべき仕事が生じるまでトランザクションを待たせることができる: atomic (queueSize > 0) { remove item from queue and use it } ガード条件が満たされていなければ、そのトランザクションは、ガード条件に影響を与えうるコミットが(他のトランザクションにより)なされるまで待たされ、その後再実行される。このように生産者と消費者の間の結びつきを弱くすることで、スレッド間で明示的にシグナルをやりとりする方法に比べてモジュール性が改善される。"Composable Memory Transactions" では、retryコマンドを導入してこれをさらに一歩押し進めている。このコマンドは、トランザクションを(その途中の任意の箇所で)アボートし、その時点までにそのトランザクションによってリードされたいずれかの共有データが変更されるまで待ってから再実行(リトライ)するというものである。例えば... atomic { if (queueSize > 0) { remove item from queue and use it } else { retry } } このように、トランザクション中のあとの段階で動的にリトライできるようにすることで、プログラミングモデルが単純になり、また新しい可能性がひらかれる。 課題の一つとして、例外がトランザクションの内から外へ伝播しようとするときにどのように振舞うべきかという点がある。"Composable Memory Transactions" では、筆者らは Concurrent Haskell では例外は予期せぬエラーを示すのが普通であり、この場合はトランザクションをアボートするのがよいと判断した。その際、例外はトランザクションの中で(リードや領域確保により)得られた情報を持ち出せるとした。これは例外の発生理由の診断に役立つ。ただし、著者らは、他の問題設定(例えば他の言語)においては他に妥当な設計判断がありうることを強調している。
※この「提案されている言語側のサポート」の解説は、「ソフトウェアトランザクショナルメモリ」の解説の一部です。
「提案されている言語側のサポート」を含む「ソフトウェアトランザクショナルメモリ」の記事については、「ソフトウェアトランザクショナルメモリ」の概要を参照ください。
- 提案されている言語側のサポートのページへのリンク