問題タブ [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.
haskell - STM は既存のデータ構造に対してきめ細かいロックを提供しますか?
Bartosz Milewski の STM に関するすばらしいブログ投稿を読んで、次の記事を読んで興奮しました。
ただし、重要な事実を考慮してください。STM は非常にきめ細かいものです。たとえば、アイテムをツリーに挿入する場合、STM トランザクションは、実際に変更しているノードのみをロックします。STM は、ツリー全体に 1 つのグローバル ロックを使用するソリューションよりも簡単に勝てます。
しかし、私が理解しているように、この動作は自動ではありませんよね? を使用するTVar (Map k a)
と、マップ全体で単一のグローバル ロックとして機能しませんか? そして、このきめの細かい動作の利点を得るには、私 (または誰か) が、内部にTMap
含まれるマップの置換 (たとえば、 )を実装する必要がありますね。TVars
これは明らかな質問のように思えるかもしれませんが、STM の実装について調べていると、TVar
s の読み取りとメモリ位置の読み取りを混同していました。私はそれが正しいことを確認したいだけです!
Bartosz 氏はさらに次のように述べています。
デッドロックのリスクがあるため、ノードごとの手動ロックを正しく実装するのは困難です。
私が理解しているように、STM との違いは、実際の STM 実装では手動でロックされたソリューションと同じようにロックを使用する一方で、実際のロックの取得と解放はプログラマーではなくランタイムによって処理されるということです。正しいですか?
haskell - Haskell 一方向 `dupTChan`
このような機能はありますか。あなたがするときを除いて:
に書き込まれたものoldChan
は に書き込まれnewChan
ますが、その逆ではありませんか?
java - Deuce STM を使用してキューに入れる
私は Deuce STM を初めて使用し、Deuce STM を使用してキューを実装するにはどうすればよいか疑問に思っていました。これが私の現在の作業実装です-
Node クラスには、value と次のフィールドへのポインタの 2 つのフィールドが含まれています。
これはそれを実装する正しい方法ですか?トランザクション例外を手動でスローする必要がありますか? これが正しければ、中止または再試行されたトランザクションの数をどのように測定すればよいでしょうか?
haskell - テンプレート haskell を使用して不足している関数を定義できますか?
いくつかの Haskell コードを別のマシンでコンパイルする必要がある状況があります。これらのマシンの少なくとも 1 台には、かなり古いバージョンのControl.Concurrent.STMがあり、それは不明modifyTVar
です。私の現在の回避策は、modifyTVar のコードを新しいバージョンのパッケージからコピーすることです。これは、テンプレート Haskell を使用して、関数が既に定義されているかどうかを確認し、欠落している場合にのみ定義できるかどうか疑問に思いました。適切な解決策は、おそらく最新のパッケージを入手することであることは承知していますが、この状況に興味をそそられました。
clojure - clojure で実行時間の長いトランザクションを高速に失敗させる方法
次のコードの参照が他のトランザクションと同様に以下のトランザクションで変更されていると仮定すると、私の懸念は、このトランザクションがコミットの時間になるまで実行され、コミットに失敗してからトランザクションを再実行することです。
これが私の恐れの全容です:
- modify-ref が呼び出され、トランザクションが開始され (A と呼びます)、長時間実行計算が開始されます。
- 別のトランザクション (B と呼びます) が開始され、my-ref が変更され、返されます (正常にコミットされます)。
- long-running-calculation は終了するまで継続します
- トランザクション A はコミットを試みますが、my-ref が変更されているため失敗します
- some-prop が true でないため、トランザクションは my-ref の新しい値で再開され (A' と呼びます)、終了します。
これが私が起こりたいことであり、おそらくこれが起こることです(私にはわからないので、質問しています:-)
トランザクション B が my-ref をコミットしたら、トランザクション A をすぐに停止して (my-ref の値が変更されたため)、新しい値で再開したいと考えています。それが起こるのですか?
この動作が必要な理由は、長時間実行計算が、現在は廃止された計算で CPU 時間をすべて浪費しないようにするためです。
を使用することを考えensure
ましたが、このコンテキストでどのように使用するか、または必要かどうかわかりません。
haskell - Haskell STM は常に成功します
haskell の stm ライブラリには、次の型シグネチャを持つ関数があります。
Haskell の STM について私が理解していることから、STM 計算の実行中に何かが「うまくいかない」(その用語を大まかに使用すると) 3 つの方法があります。
- 読み取られた TVar の値は、別のスレッドによって変更されます。
- ユーザー指定の不変条件に違反しています。
retry
これは通常、最初からやり直すために呼び出すことによってトリガーされるようです。これにより、スレッドが効果的にブロックされ、読み取りセットの TVar が変更されると再試行されます。 - 例外がスローされます。呼び出し
throwSTM
が原因です。これは、トランザクションが再開されないため、最初の 2 つとは異なります。代わりに、エラーが伝播され、プログラムがクラッシュするか、IO モナドでキャッチされます。
これらが正確である場合 (正確でない場合は教えてください)、何ができるのか理解alwaysSucceeds
できません。そのalways
上に構築されているように見える関数は、次のように記述しなくてもよいようですalwaysSucceeds
。
のドキュメントにalwaysSucceeds
は次のように書かれています:
alwaysSucceeds は、alwaysSucceeds に渡されたとき、現在のトランザクションの最後、および後続のすべてのトランザクションの最後に true でなければならない新しい不変条件を追加します。これらのポイントのいずれかで失敗した場合、違反しているトランザクションは中止され、不変条件によって発生した例外が伝播されます。
しかし、引数は型STM a
( では多態的a
) であるため、トランザクションが返す値を意思決定のどの部分にも使用することはできません。つまり、先ほど挙げたさまざまなタイプの障害を探しているようです。しかし、そのポイントは何ですか?STM モナドはすでに失敗を処理しています。この関数でラップすると、どのように影響しますか? また、型の変数がa
削除されて、結果が になるのはなぜSTM ()
ですか?