問題タブ [concurrentdictionary]
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# ConcurrentDictionary AddOrUpdate
AddOrUpdate メソッドについて混乱しています。このドキュメントでは、updateValueFactory が同期されていないと具体的に述べています。
MSDN では、この例が与えられました。
複数のスレッドが oldvalue をインクリメントしようとしている場合、そのうちのいくつかが代わりに古い値を更新している可能性はありませんか?
ありがとう。
.net - .Net に ConcurrentSet のようなものはありますか?
私はConcurrentDictionary
in .Net を使用しており、それを使用して並行クラスを作成するのがいかに簡単であるかに恋をしました。
今、私は別のシナリオを持っています。私は基本的に、重複していない順序付けられていないリストで単一のオブジェクト型を追跡する必要があるため、基本的にSet<T>
型のことですがConcurrentDictionary
、GetOrAdd
.
このようなものは .Net に組み込まれていますか?
ConcurrentDictionary を使用するだけでキーだけを気にし、値を使用しないことを検討しましたが、これは非常に最適ではないようです
c++-cli - c ++cliConcurrentDictionary警告4538
私がこのc++cliコードを持っているとき:
最初の{で警告C4538が表示されます。誰かがこれが起こる理由とそれが警告するものの手がかりを持っていますか、またはこれはこの質問の状況のようにコンパイラのバグでもあります:C ++/CLIでの不適切なコンパイル警告のようです
それらは多少関連しているように見えますが、私はGroup
オブジェクトではなく、を持っていますConcurrentDictionary
。.NET4.0フレームワークを対象としたVisualStudio2010を使用しており、/clrコンパイラフラグをオンにしてコンパイルしています。
正確なエラーメッセージは次のとおりです。
c# - シングルスレッドでのConcurrentDictionary<>のパフォーマンスの誤解?
関連する簡単な情報:
AFAIK、並行スタック、キュー、およびバッグクラスは、リンクリストを使用して内部的に実装されます。
また、各スレッドが独自のリンクリストを担当するため、競合がはるかに少ないことを私は知っています。とにかく、私の質問はConcurrentDictionary<,>
しかし、私はこのコードをテストしていました:(シングルスレッド)
結果:(何度もテスト、同じ値(+/-))。
質問 :
シングルスレッド環境で何がConcurrentDictionary<,>
はるかに遅くなるのですか?
私の最初の本能は、それlock(){}
が常に遅くなるということです。しかし、明らかにそうではありません。
c# - ConcurrentDictionary は SortedList の「同時」バージョンですか?
ConcurrentDictionary
私はversの計算の複雑さを理解したいと思いますSortedList
(これは ですO(logarithmic(n))
)、ConcurrentDictionary は単なる同時同期実装SortedList
ですか? またはこれらのデータ構造は異なりますか?お互いに?
c# - ConcurrentDictionary.AddOrUpdate メソッドが遅いのはなぜですか?
私はスレッドセーフな多値辞書に取り組んでいます。内部的に、このディクショナリはカスタム リンクリストを値として持つコンカレント ディクショナリ (.net 4.0) を使用します。同じキー項目がリンクリストに追加されます。問題は、コンカレント ディクショナリの AddOrUpdate メソッド(アプローチ 1)を使用して項目を挿入すると、TryGetValue メソッドを使用してキーが存在するかどうかを確認してから値を追加または更新する場合と比較して、コードの実行が少し遅くなることです。手動でロック内(アプローチ 2)。最初のアプローチを使用すると、300 万レコードを挿入するのに約 20 秒かかりますが、2 番目のアプローチを使用すると、同じマシン (Intel i3 第 2 世代 2.2 GHz & 4 Gb RAM) で約 9.5 秒かかります。私がまだ理解できない何かが欠けているに違いありません。
並行辞書のコードもチェックしましたが、ロック内で行っているのと同じことをしているようです:
スレッド セーフな多値ディクショナリのコードを次に示します (アプローチ 2 はコメント化されています。コメントを外して違いを確認してください)。
更新:下に貼り付けていない削除、追加、およびその他のメソッドもあります。
テスト コードは項目を挿入するだけで、すべて一意のキーを持ちます。以下の通りです。
更新 1:
「280Z28」からの回答に基づいて、質問を言い換えています。GetOrAdd と 'my' メソッドがほぼ同時にかかるのはなぜですか。私のメソッドのように、余分なロックを取得し、TryAndGet メソッドも呼び出しています。また、AddOrGet と比較して AddOrUpdate に 2 倍の時間がかかるのはなぜですか。すべてのアプローチのコードは次のとおりです。
ConcurrentDictionary (.net 4) の GetOrAdd および AddOrUpdate メソッドには、次のコードがあります。
私のコードで GetOrAdd は次のように使用されます (9 秒かかります):
AddOrUpdate は次のように使用されます (すべての追加に 20 秒かかり、更新はありません)。回答の1つで説明されているように、このアプローチは更新には適していません。
AddOrGet と AddOrUpdate を使用しないコードは次のとおりです (9.5 秒かかります)。
.net - ConcurrentDictionary TryGetValue vs []. [] はまだスレッドセーフですか?
私は次のものを持っていますConcurrentDictionary
:
私はそれsessions.TryGetValue(key, out session)
がスレッドセーフであることを知っていますが、私の質問はsessions[key]
スレッドセーフでもあるかどうかです。
sessions.TryGetValue(key, out session)
値を取得できたかどうかに応じて、true または false を返します。
値を取得できない場合はsessions[key]
戻りますか? null
そう思うでしょう。誰かがこれを確認したり、もっと明らかにしたりできますか? ありがとう。