10

免責事項: これはMVar ()、 を単純なミューテックスとして使用して簡単に実行できます。それがSTMでできるかどうか、私は好奇心だけです。

私はアトミックに次のことをしたい:

  • いくつかの変数を読み取ります。

  • 今読んだ内容に基づいて、実行する I/O を決定します。

  • I/O を実行します。

  • 結果を変数に記録します。

具体的に言うと、読み取った入力のバイト数を追跡​​し、特定のバイト数が消費された後に EOF に達したと仮定します。(OK、2 つのスレッドが同じファイルから同時に読み取れるようにすることは、おそらく最初に行うべきではないことですが、これについては私と一緒に行ってください...)

明らかに、これは単一の STM トランザクションではありません。真ん中にI/Oがあります。明らかに、それを 2 つの接続されていないトランザクションとして持つことも間違っています。(2 つのスレッドが 1 バイトのクォータが残っていることを認識し、両方がそのバイトを読み取ることを決定する可能性があります。)

この問題の良い解決策はありますか? それとも、STM は単にこのタスクに不適切なツールなのでしょうか?

4

3 に答える 3

6

TVar Bool名前付きを使用してconsistent、IO アクションが進行中かどうかを追跡します。一貫性を に設定した IO アクションを実行する前と、 に設定しFalseた IO アクションの実行後。次に、変更している STM 変数の値に依存するアクションは、この句を先頭に置くだけです。consistentTrue

do b <- readTVar consistent
   check b
   ...

これにより、これらのアクションは、変更されている変数の一貫したビューのみを参照し、IO アクションの進行中は実行されません。

于 2013-07-06T13:41:09.557 に答える
4

stm-io-hooksパッケージを探していると思います。

あなたが実際にやりたいことは何であれ、それを STM の中止/再試行のセマンティクスで表現することは可能でしょうか? つまり、ロールバックを実行して IO アクションを繰り返すことができますか? そうでない場合は、Gabriel Gonzalez の回答を参照してください。

于 2013-07-06T14:10:50.450 に答える
1

STM にはそれができないと思いますが、それは意図的なものです。トランザクションがロールバックした場合、STM コードの一部をさまざまな場所で複数回再開できます。トランザクションを実行し、I/O アクションを実行し、結果を変数に記録するときにロールバックするとどうなるでしょうか?

このため、STM の計算は純粋でなければならず、STM の変更可能な変数や配列などの STM プリミティブを追加するだけです。

于 2013-07-06T12:18:51.703 に答える