スレッドセーフではないコード(ライターから共有データへ)はシリアル化された方法で複数のスレッドからしか呼び出せませんが、ブロックしたくありませんこのコードが呼び出されていないときは、他のスレッドセーフな作業(複数のリーダー)。Clojureで複数のリーダー/シングルライターのスレッドを同期する
これは基本的に、複数のリーダー/単一のライタータイプのロック状況であり、ライターはリーダーと他のライターの両方を除外する必要があります。
私は2つの機能があります。すなわち:任意の単一のスレッドがライタ機能を実行している場合
(do
(reader-function)
...
(writer-function))
:
(defn reader-function [] ....) // only reads from shared data
(defn writer-function [] ....) // writes to shared data
そして(おそらくループ内で)実行しているスレッドの数は、次のように他のすべてのスレッドはブロックする必要があります。つまりは、いずれかの時点で、次のいずれか
- つのスレッドが ライターを実行しており、すべての 他は
- 複数のスレッドが がリーダー機能を実行しているブロックされている、おそらくいくつかのスレッドが が ライターを実行するために待機してブロックされています一度すべての読者が完了したら
Clojureでこの種の同期を達成する最良の方法は何ですか?
RRWLはこれを行いますが、Clojureでこの問題を解決するために使用しないでください。 RRWLを使用してデータを保護する場合、Clojureの不変なデータ構造、参照、またはSTMを利用していません。 ClojureのClojureデータ構造の参考文献は、すでに複数の読者を許しています。彼らは不変で永続的なので、いつでもライターをブロックすることなくderef'edすることができます。 http://clojure.org/refsを読んでください。 –
ありがとうラルフ!それは私が必要とする行に沿っているように見えます。 Clojureに相当するものがあるかどうか、またはこの機能を実現するためにJava相互運用機能を使用する必要があるかどうかについての考えはありますか? – mikera
@mikera:Alex Millerがコメントで述べたように、refsはこのように動作しますが、私が知る限り、Clojureにはこれを行うための特定の機能がありません。 – Ralph