2016-03-31 6 views
2

retryに達するSTMという式を実行すると、スレッドがブロックされ、エントリが変更されるとトランザクションが再度実行されます。Haskell STMと再試行

しかし、私は思っていた:

  • 我々は再試行につながるという特定のブランチでは、実際に使用されていない、STM変数を読めば、それは再びトランザクションを実行しようとする更新のでしょうか?

  • スレッドはブロックされていますが、実際にはブロックされていますか?他の潜在的に待機している操作で使用するためにスレッドプールでリサイクルされていますか?

+1

私はあなたの最初の質問に従うことに苦労しています。例を提供するのはどうですか?あなたの2番目の質問については、スレッドがブロックされています。しかし、Haskellスレッドは実際にはデフォルトでは緑のスレッドなので、多くのスレッドは1つのシステムスレッドで実行されます。これは、他のHaskellスレッドがブロックされている間も、そのスレッドが引き続き作業を実行できることを意味します。 –

+0

第1の質問:2つの変数を読み込んでいますが、トランザクションは実際には1の値に依存します。 – nicolas

+0

私は緑のスレッドが最初の近似の実装について本当に気にしないほど効率的だと思います – nicolas

答えて

5
  1. はい。 STM変数を読み込むと、stmReadTVarが呼び出されます。hereを参照してください。これにより、トランザクションレコードに新しいエントリが生成され、コミット時にチェックされます。 hereを見ると、副作用(has_side_effects = True)の操作としてマークされたReadTVarOpが見つかるので、結果を使用するかどうかにかかわらず、コンパイラはそれを排除するとは思わない。
  2. @WillSewellが書いたように、Haskellは緑色のスレッドを使用しています。実際のOSスレッドがブロックされることを心配することなく、シングルスレッド実行時にSTMを使用することもできます。
+0

おかげさまで、ありがとうございました – nicolas

2

Re。 1:私はあなたの質問を理解しています。あなたのSTMトランザクション全体は、の(https://ghc.haskell.org/trac/ghc/ticket/8680参照)で構成されたブランチを含む世界の一貫したビューを持ちます。しかし、私はあなたが何を意味するのかはわかりませんが、私のトランザクションは実際にはただ1つの変数の値に依存しています。 readTVarを実行すると、そのvarへの変更が追跡されます。

Re。 2:緑色のスレッドは、スタック状のものに保存され、一時停止して実行され、一時的に実行されていないスタックに戻す、保存された計算状態の塊と考えることができます(「ブロックされた」)、またはそれらが十分に長く実行された後。これが並列で発生する度合いは、実行時に(+RTS -N経由で)実行するように指示したOSスレッドの数によって決まります。何千もの緑色のスレッドを使用するが、単一のOSスレッドのみで実行される並行プログラムを作成することができます。

+0

おかげさまで、ありがとう – nicolas