4

次のバージョンのリーダー-ライター問題があります: 複数のリーダーとライター、2 人以上のリーダーが同時に読み取ることができます。ライターが書き込みを行っている場合、誰も読み書きできません。 100 ラウンドの例では、5 人のライターがそれぞれ約 20 回書き込む必要があります)。STMを使用してClojureでこれを実装する適切な方法は何ですか? 私は完全なコードを探しているのではなく、いくつかの一般的な指示を探しています。

4

3 に答える 3

4

Clojure の組み込み STM は、探しているすべての制約を実際に含めることはできません。これは、リーダーがライターを待つことはなく、要件ではリーダーが待機する必要があるためです。

読者をブロックしないことを許せるなら、先に進んでください

(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))

ブロックするリーダーが必要な場合は、別の STM が必要になります。世界にはたくさんの STM があります。

于 2011-11-22T18:52:01.757 に答える
3

Clojure の STM は、それよりもはるかに優れた保証を提供します。ライターはお互いに待機しますが、ライターが書いている間もリーダーは読むことができます。最新の一貫した状態が表示されるだけです。書き手がまだ書き終えていない場合、読み手にはその変更がまったく表示されません。

于 2011-11-22T20:49:01.640 に答える
0

他の回答で述べたように、リーダーは読み取り中にブロックせず、リーダーをブロックしたい場合は、コールバック関数で取得したのと同じ値を書き込む「ライター」として実装する可能性があります。私はこれが奇妙な解決策であることを知っていますが、これはあなたを助けたり、さらなる指示を与えることができるかもしれません.

于 2011-11-23T05:04:56.047 に答える