問題タブ [stm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
clojure - Clojure STM は、atom および agent フォームと関係がありますか?
Clojure での同時実行プログラミングを調べています。 http://clojure.org/concurrent_programming
プログラムの状態を維持するためにatom、ref、およびagentフォームが使用されることを知りました。
調整された更新にはrefのみが使用されるため、変更を実行するときにdosyncマクロが使用されます。
したがって、この時点で STM エンジンが関与していることは明らかです。
私が持っている次の疑いについて明確にしたかったのですが、
Clojure STM は、atom フォームやエージェント フォームとも関係がありますか? それとも、単に java.util.concurrent.atomic 機能を利用しているだけですか?
multithreading - スレッドが出力をインターリーブしないようにする
次のプログラムは、同時に実行される 2 つのスレッドを作成し、それぞれがランダムな時間だけスリープしてから、テキスト行を stdout に出力します。
出力は一般的に次のようになります
一度に 1 つのスレッドだけが stdout に書き込めるようにするにはどうすればよいでしょうか? これは STM が得意とする種類のことのように思えますが、すべての STM トランザクションSTM a
には一部の型が必要a
であり、画面に出力するアクションには型があり、にIO a
埋め込む方法はないようです。IO
STM
haskell - GHCi で TVar の値を調べる
サイモン・ペイトン・ジョーンズの同時実行の例で作業すると、次のコードが得られます。
GHCi REPLでこれをテストしようとしています
当座預金残高が $110 であることを確認するにはどうすればよいですか?
私が試してみました
clojure - トランザクション内の deref は再試行をトリガーする可能性があります - ref 状態履歴の役割は何ですか?
「Clojure プログラミング」(Emerick、O'Reilly) は次のように述べています。
(...) 現在のトランザクションの開始以降に別のトランザクションによって新しい値がコミットされた場合、トランザクションの開始時点での ref の新しい値は提供できません。幸いなことに、STM はこの問題に気付き、トランザクションに関係する参照の状態の限定された履歴を維持します。履歴のサイズは再試行ごとに増加します。これにより、ある時点でトランザクションを再試行する必要がなくなる可能性が高くなります。これは、ref が同時に更新されている間、目的の値がまだ履歴に存在するためです。
次に、問題を説明するためにいくつかのコード サンプルを示します。
最初に、すべての書き込みトランザクションが完了した後にのみ読み取りトランザクションが成功することを説明します (したがってa = 500
):
次に、その設定を説明し:min-history
、:max-history
リーダー トランザクションの再試行に役立つ場合があります (今回a
は以前に正常に読み取られました - 値は 33 です)。
deref
リーダートランザクション内で再試行が発生する理由を理解しています(一部のライタートランザクションが参照への変更をコミットしている場合)。私が理解していないのはこの部分です:「これにより、ある時点でトランザクションを再試行する必要がなくなる可能性が高くなります。これは、参照が同時に更新されている間、目的の値がまだ履歴に存在するためです」.
「望ましい値」とは何ですか?上記の例では、時間の経過とともに参照履歴がどのように変化しますか? 参照履歴がどのように機能するかを示すタイムラインの説明または例を教えてもらえますか?
multithreading - タイムアウト付き TChannel の使用
次のように動作するスレッドの入力として TChannel があります。
誰かが特定の時間内に TChannel に書き込みを行った場合、コンテンツを取得する必要があります。指定された時間内に何も書き込まれない場合は、ブロックを解除して続行する必要がありNothing
ます。
これに対する私の試みは、次のようなタイムアウト関数を使用することでしたSystem.Timeout
:
これは機能しているように見えましたが、パケットを失うことがあることを発見しました (パケットはチャネルに書き込まれますが、反対側では読み取られません。ログには次のように表示されます:
ここで、「Pushing Recorded Packet」は 1 つのスレッドからの書き込みであり、「Sending Recorded Packet」は送信側スレッドの TChannel からの読み取りです。の行がSending Recorded Packet 2 1439
ありません。これは、TChan からの読み取りが成功したことを示します。
間違った時点でタイムアウトを受信すると、チャネルがパケットを失うようです。threadKill
内部で使用されている関数とtimeout
STM がうまく連携していないのではないかと思います。
これは正しいです?誰かがパケットを失わない別の解決策を持っていますか?