問題タブ [concurrent-collections]
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# - System.Collections.Concurrent.BlockingCollection を使用して、コレクションが容量の半分に達するまでプロデューサーをブロックする
BlockingCollection
new of で実装された「単一のプロデューサー/単一の消費者」シナリオがあり.NET 4.0
ます。
問題は、コレクション内に 1 つのスペースが空くとすぐにプロデューサー スレッドが起動することです。コンシューマがコレクション アイテムの少なくとも半分を消費するまで、プロデューサがブロックするようにします。これは、プロデューサの速度が速く、プロデュースがシステムにとってコストがかかるためです。
プロデューサーのブロッキング条件を制御するにはどうすればよいですか?
c# - マルチスレッドシナリオでコレクションを利用してルーチンを高速化する方法
データの処理に並列化を利用するアプリケーションがあります。
メインプログラムはC#にあり、データを分析するためのルーチンの1つは外部C++dllにあります。このライブラリはデータをスキャンし、データ内に特定の信号が見つかるたびにコールバックを呼び出します。データを収集、並べ替えてから、HDに保存する必要があります。
これは、コールバックによって呼び出されるメソッドと、データを並べ替えて保存するためのメソッドの最初の簡単な実装です。
データは、サイズ10000 xnの2次元配列(short [] []データ)で構成され、n変数があります。私はこのように並列化を使用します:
ここで、10000の配列のそれぞれについて、0から4のコールバックが発生する可能性があると推定します。私はボトルネックに直面しており、CPUリソースが過剰に使用されていないことを考えると、ロック(数千のコールバックと一緒に)が問題であると思います(私は正しいですか、それとも何か他のものがある可能性がありますか?)。ConcurrentBagコレクションを試しましたが、パフォーマンスはさらに悪くなっています(他のユーザーの調査結果と一致しています)。
ロックフリーコードを使用するための可能な解決策は、複数のコレクションを持つことだと思いました。次に、並列プロセスの各スレッドを単一のコレクションで機能させるための戦略が必要になります。コレクションは、たとえばスレッドIDをキーとするディクショナリ内にある可能性がありますが、このための.NET機能はわかりません(並列化を開始する前にディクショナリを初期化するためのスレッドIDを知っている必要があります)。このアイデアは実現可能でしょうか。そうであれば、このための.NETツールは存在しますか?または、プロセスをスピードアップする他のアイデアはありますか?
[編集]ReedCopseyの提案に従い、次のソリューションを使用しました(VS2010のプロファイラーによると、リストのロックと追加の負担がリソースの15%を占める前は、現在は1%にすぎません)。
pthreads - cnc/tbb で使用されるスレッドの制御数
Intel cnc ライブラリを使用していますが、コアと同じ数のスレッドが作成されます。目的に使用されるスレッドの数を制御し、場合によってはそれらの配置を制御する方法はありますか?
c# - コンカレント辞書対辞書
ConcurrentDictionary<TKey, TValue>
クラス 複数のスレッドが同時にアクセスできるキーと値のペアのスレッド セーフなコレクションを表します。
しかし、私が知っているように、System.Collections.Concurrent
クラスは PLINQ 用に設計されています。
サーバーにオンラインのクライアントを保持するものがDictionary<Key,Value>
あり、アクセスできるときにオブジェクトをロックすることでスレッドセーフにします。
私の場合、安全に置き換えることができますDictionary<TKey,TValue>
かConcurrentDictionary<TKey,TValue>
?交換したら性能は上がりますか?
この第 5 部で、Joseph Albahari は、並列プログラミング用に設計されていると述べました。
- 並行コレクションは、並列プログラミング用に調整されています。従来のコレクションは、高度な同時実行シナリオを除くすべてのシナリオで優れています。
- スレッド セーフなコレクションは、それを使用するコードがスレッド セーフであることを保証しません。
- 別のスレッドがそれを変更している間に、並行コレクションを列挙しても、例外はスローされません。代わりに、古いコンテンツと新しいコンテンツが混在しています。
- List の同時バージョンはありません。
- 並行スタック、キュー、およびバッグ クラスは、リンクされたリストを使用して内部的に実装されます。これにより、非並行の Stack および Queue クラスよりもメモリ効率が低下しますが、リンク リストはロックフリーまたは低ロックの実装に役立つため、並行アクセスには適しています。(これは、リンクされたリストにノードを挿入するには、いくつかの参照を更新するだけで済みますが、リストのような構造に要素を挿入するには、何千もの既存の要素を移動する必要がある場合があるためです。)
c# - GetOrAdd()ValueFactoryが複数回呼び出された場合、追加の戻り値はどうなりますか?
C#並行辞書、特に署名。。。
。。。valueFactoryが複数回呼び出される可能性があることを私は知っています。しかし、複数の戻り値はどうなりますか?ディクショナリにマップされる結果は1つだけであることが保証されていますか、それとも他のスレッドがディクショナリ内の異なる値を表示できるウィンドウがある可能性はありますか?
silverlight - Silverlight 4で利用できるスレッドセーフなコレクションクラスは何ですか?
クライアント側のSilverlightとサーバー側の.NET4で利用されるアプリケーションフレームワークを開発しています。内部的には、フレームワークにはディクショナリとキューのデータ構造があり、複数のスレッドがコレクションに同時にアクセスします。
サーバー側では、 System.Collections.Concurrent名前空間で使用可能なConcurrentDictionaryクラスとConcurrentQueueクラスを利用したいと思います。ただし、これらのクラスはSilverlight4では実装されていません。
私が検討している2つのアプローチは次のとおりです。
- ConcurrentDictionaryクラスとConcurrentQueueクラスを逆コンパイルし、Silverlightクラスライブラリに実装します。これらは、 System.Collections.Concurrent名前空間を使用してスコープされます。
- サーバー側とクライアント側の両方で使用できる共有ライブラリに必要なカスタムスレッドセーフコレクションクラスを実装します(または信頼性の高いSilverlightスレッドセーフコレクションの実装を見つけます)。
最初のアプローチでは、必要なSilverlightデータ構造を実装するだけで済みますが、Silverlightの実装と.NET4で実装された同時収集クラスの間に不一致が生じるのではないかと心配しています。
2番目のアプローチは、クライアント側とサーバー側の両方で一貫した同時収集の実装を提供しますが、私は車輪の再発明をしているように感じます。
SilverlightでConcurrentDictionaryクラスとConcurrentQueueクラスを実装することは非常に難しいとは思われませんが、Silverlightにスレッドセーフなコレクションクラスのライブラリがすでによく採用されていますか?
c# - キューで動作している複数のスレッドが存在する場合に、ConcurrentQueueの最年少要素にアクセスする
3つのスレッド間でデータを共有するために使用されるConcurrentQueueがあります。スレッドAは継続的にキューをデータで満たします。スレッドBは、このデータをファイルに記録するように設計されています。スレッドCは、キュー内の最も若いエントリ(または可能な限り最も若いエントリに近い)を取得し、そのエントリに対していくつかの操作を実行して、結果を画面に表示することになっています。
スレッドBは、ファイルの書き込み操作を時間内にクラスター化するために、次のようなことを行います。
つまり、少なくとも100個の要素がキューに入れられるのを待ってから、それらをディスクに書き込みます。ただし、常に少なくとも1つのアイテムをキューに保持します。その理由は、スレッドCが常に少なくとも1つのアイテムにアクセスできるようにするためです。
スレッドCのループは次のようになります。
このループでは、データをディスクに書き込むスレッドとcq.ElementAt(cq.Count-1)呼び出しの間の競合が原因で、例外が発生することがあります。私は何が起こっているのかは次のとおりだと思います。
- cq.Countは、たとえば90と計算されます。
- その時点で、スレッドBはすでにループを開始しており、ディスクに書き込むためにキューからデータをデキューしています。
- cq.ElementAt()が呼び出されるまでに、スレッドBは、(cq.Count-1)がキュー内の有効なエントリを指さなくなるような多くのアイテムを消費しました。
キューで動作している複数のスレッドが存在する場合に、キュー内の最も若いエントリにアクセスするための優れた方法について何かアイデアはありますか?
よろしく、
java - 同期メソッドのweakValueマップ参照でのメモリリーク
同期の詳細を抽象化しながら、メソッドを同時に実行するためのインターフェイスを作成しています(必要に応じて分散実装と交換するため)。異なる参照の文字列が渡された場合でも、文字列をマップに格納して1つの参照が使用されるようにすることで、文字列をミューテックスとして使用できる単一のjvm実装を作成しました。並行性は正常に機能しているようですが、テストが参照カウントが決して減少していないことを示しているのを見て驚いた。WeakValues()を使用すればメモリリークを防ぐのに十分だと思いましたが、そうではないようです。このリークの原因を誰かが指摘できますか?
}
最後のアサーションで失敗したテストは次のとおりです。
}
この最後のアサーションは、テストを破るものです。assertEquals(0、methodExecutor.mutexMap.size());
garbage-collection - 「ほぼ同時のガベージコレクタ」とは何ですか?
私はストップ・ザ・ワールド、インクリメンタル、パラレル、コンカレント、(ソフト/ハード) リアルタイム ガベージ コレクタの概念を知っています。しかし、私は主に並行GCを理解できません。同時GCとの違いは?違いは何ですか?なぜほとんどと呼ばれるのですか?
java - 挿入順序を維持する並行セットを実装する方法
挿入順序を維持しながら、(ConcurrentModificationExceptionをスローしないように)同時に変更できるSet実装が必要です。私は自分のコンパレータで
使用してみました-サンプルコード:ConcurrentSkipListSet
しかし、セットが
[b、c、a、b、d]を出力するため、このコンパレータは#failであるように見えます。bが2回そこにある場合、そのセットはありません。
私が見なければならない他の選択肢はありますか?