問題タブ [transactional-memory]
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.
c++ - C++ のトランザクショナル メモリを試した人はいますか?
私は Intel の「whatif」サイトとそのトランザクション メモリ コンパイラをチェックしていました (データベースのように、各スレッドはアトミック コミットを行うか、システムのメモリをロールバックする必要があります)。
ロックとミューテックスを置き換える有望な方法のように思えますが、多くの証言は見つかりません。ここに誰か入力がありますか?
locking - トランザクション メモリを要求しすぎていませんか?
私は最近、トランザクションメモリについてよく読んでいます。TM は少し誇大宣伝されているため、多くの人が熱心に取り組んでおり、ロックに関する厄介な問題の解決策を提供していますが、定期的に苦情も見られます。
- I/O を行うことはできません
- アトミック セクションを複数回実行できるように記述する必要があります (ローカル変数に注意してください!)。
- ソフトウェア トランザクショナル メモリのパフォーマンスが低い
- [ここにあなたのペットのおしっこを挿入してください]
私はこれらの懸念を理解しています: 多くの場合、いくつかの本当に気の利いたアトミック操作 ( LL/SCなど) をサポートする特定のハードウェアでのみ実行される STM に関する記事を見つけたり、架空のコンパイラでサポートする必要があるか、それを必要とします。メモリへのすべてのアクセスがトランザクショナルであること、モナド スタイルの型制約などが導入されることなどです。そして何よりも、これらは実際の問題です。
ロックの代わりにトランザクション メモリをローカルで使用することに反対する理由は何ですか? これはすでに十分な価値をもたらすでしょうか、それともトランザクション メモリを使用する場合、あらゆる場所で使用する必要がありますか?
performance - トランザクショナル メモリが実用化されるには何が必要でしょうか?
私はトランザクショナル メモリと、システム プログラミング (データベース、オペレーティング システム、サーバーなど) の実行可能性についていくつかの作業を行ってきました。トランザクションを使用した私自身の経験と、実際のコードでトランザクションを使用するコミュニティがいかに少ないかを見てきたことから、次のような疑問が生じました。実動コードを作成している開発者が、業務にトランザクション メモリを使用することを納得させるにはどうすればよいでしょうか?
一般採用になるのでしょうか?高速?信頼性の向上?いくらで?
まだ見ていない方のために説明すると、メモリ トランザクションはデータベース トランザクションのように動作します。操作は (明らかに) 並行して進行し、2 つのトランザクション間で競合が発生した場合 (両方とも同じ値を書き込むなど)、トランザクションの一方または両方が実行されます。ロールバックされて再起動されます。
トランザクション メモリにはいくつかの利点があります。
- 信頼性デッドロックから完全に解放されます (たとえば、間違った順序のロック)。
- パフォーマンスロックの競合が少ない場合は速度が向上します。
- プログラマビリティ 多くの同期オブジェクトを管理せずに、きめ細かい同時実行制御を実現します。
ただし、 TM が正しく、完全で、高速に実装されていると仮定しても、ロックと比較すると、このプリミティブには既知の欠点があります。
トランザクションは数回実行される可能性があるため、経験的な実験以外でパフォーマンスを予測することはより困難です。
パフォーマンスのバグを再現できますか?
正しい実装間で異なるポリシー決定がいくつかあります。たとえば、別のトランザクション内で終了するトランザクションはどうなりますか? 今コミットしますか、それとも待ちますか?
コードの局所的な効果を十分に理解できるでしょうか?
ロールバックされるトランザクションで取消不能な動作 (「ミサイル発射」コマンドの送信など) をサポートするために、ランタイムはより複雑になります。
コードのグローバルな影響を適切に理解できますか?
最後に、ソフトウェア実装が最初に使用される可能性が高いため (いくつか例を挙げると、C、C++、Haskell、Clojure、および Scala には既に実装があります)、実際にはパフォーマンスの問題があります。競合が中程度の場合、ソフトウェア トランザクションはパフォーマンス ヒットを伴います。
パフォーマンスの予算はいくらですか? メリットが潜在的なコストを上回るのはどの時点ですか?
haskell - Erlang のメッセージ キューのように Haskell の TChannel でメッセージを遅延させるにはどうすればよいですか?
次の Erlang コードを検討してください。
出力は次のとおりです。
前の受信パターンがそのメッセージと一致しないため、メッセージの処理final
は基本的に最後の受信ブロックまで延期されます。
Haskell の TChannel でこれを行うにはどうすればよいですか?
database - ソフトウェア トランザクション メモリはデータベース トランザクションと同じですか?
特にHaskellに関連して、ソフトウェアトランザクションメモリについて多くのことを読みましたが、データベーストランザクションとの違いを理解しようとしていますか? STM には理解できない利点がありますか?
haskell - STMモナド問題
これは、私の質問を説明するための単なる架空のシナリオです。2つのスレッドと1つのTVarがそれらの間で共有されていると仮定します。1つのスレッドには、TVarを読み取り、完了するのに10秒かかるアトミックブロックがあります。別のスレッドには、TVarを毎秒変更するアトミックブロックがあります。最初のアトミックブロックはこれまでに完了しますか?ログが永続的に一貫性のない状態にあるので、確かにそれは最初に戻り続けるでしょう?
haskell - Clojure、Haskell (およびその他の言語) で STM 用に使用されているアルゴリズムは何ですか?
私が理解しているように、ソフトウェア トランザクショナル メモリを実装するためのアルゴリズムはいくつかあります (これは非常に活発な研究分野です)。さまざまな言語やライブラリ、特に Clojure と Haskell (GHC) で使用されている (ソース コードに飛び込まなくても) どこで見つけることができますか?
haskell - ClojureSTMはHaskellSTMとどのように異なりますか?
ClojureがSTMと呼んでいるものと、HaskellにSTMとして実装されているものとの違いを見つけようとしています。実際の言語のセマンティックの違いは別として、Rich HickeyがスピーチでClojureのSTMの実装は他のどの言語とも大きく異なると言っているので、少し混乱していますが、言語の選択以外の違いはわかりません。
haskell - Haskell STM の簡単なことを理解しようとする
STM のアトミックな概念を理解するのに行き詰まりました。
例を挙げて説明します
サンプル出力は次のようになります。
add in 1 の結果 True add in 4 の結果 False add in 1 の結果 false add in 2 の FalseResult add in 3 False Hello World? 4 False を加算した結果
add in 1 の結果 False add in 2 の結果 False add in 3 の結果 False add in 4 の結果 False
add in 1 の結果 False add in 2 の結果 Falseadd in 3 の結果 Falseadd in 4 の結果 False
add in 1 の結果 False add in 2 の結果 Falseadd in 3 の結果 Falseadd in 4 の結果 False
add in 1 の結果 False add in 2 の結果 Falseadd in 4 の結果 Falseadd in 3 の結果 False
add in 1 の結果 False add in 4 の結果 Falseadd in 2 の結果 Falseadd in 3 の結果 False
add in 1 の結果 False add in 4 の結果 False add in 2 の結果 False add in 3 の結果 False
add in 1 の結果 False add in 4 の結果 False
add in 2 の結果 Falseadd in 3 の結果 False
add in 1 の結果 False add in 4 の結果 False
add in 2 の結果 False add in 3 の結果 False add in 1 の結果 False add in 4 の結果 False
add in 2 の結果 Falseadd in 3 の結果 False
add in 1 の結果 False add in 4 の結果 False
私が原子的に読んだとき
. これは、トランザクションが使用している変数を他のスレッドが変更することなく、トランザクション内のすべての操作が完全に完了するか、またはトランザクションが失敗し、トランザクションが開始される前の状態にロールバックされることを意味します。つまり、アトミック トランザクションは完全に完了するか、まったく実行されていないかのようになります。
では、場合によっては succ の「リターン」が決して起こらないという問題がありますか? つまり、行 succ <- アトミックに $ runAdd d putStrLn $"Result of add in " ++ (show i)++ " " ++( show succ)
「add in ?i の結果」の出力を与える (「まったく実行されなかったかのように」)