6

Clojure (およびその他の Lisp 方言) を使用すると、実行中のコードを変更できます。では、実行時に関数が変更された場合、その変更は複数のスレッドで利用可能になるのでしょうか?

並行設定で技術的にどのように機能するかを理解しようとしています.複数のスレッドが関数 foo を使用している場合、関数foo再定義すると(たとえばdefnを使用すると)どうなりますか?

何らかの同期が行われている必要があります。そのような同期はいつ、どのように行われ、どのような費用がかかりますか?

JVM で言えば、関数は参照を使用してvolatile参照されていますか? もしそうなら、「関数検索」があるたびにvolatileコストを支払わなければならないということですか?

4

1 に答える 1

8

Clojure では、関数はIFnクラスのインスタンスであり、ほとんどの場合 に格納されvarsます。vars は、スレッド ローカル値の Clojures メカニズムです。

  • 関数を参照するように var の「ルート バインディング」を設定する関数を定義する場合
  • 他のスレッドは、var のルートバインディングの現在の値を取得しますが、値を変更することはできません。これにより、ルートスレッドのみが値を設定できるため、2 つのスレッドが var の値をめぐって争う必要がなくなります。
  • スレッドは、必要に応じて var の新しい値を使用することを選択できますが、これを呼び出すと、他のスレッドが読み取ることができないため、自由に変更できるbinding独自のスレッド ローカル値が与えられます。

vars をよく理解することは、少し勉強する価値があります。慣れると、vars は非常に便利な同時実行デバイスです。

ps: 通常、ルート スレッドは REPL です。 pss: もちろん、たとえば、関数のグループをアトミックに更新する必要がある場合は、vars 以外に関数を自由に格納できますが、これはまれです。

于 2012-06-28T00:31:17.970 に答える