問題タブ [concurrent-vector]

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.

0 投票する
3 に答える
1582 参照

sorting - TBBのconcurrent_vectorまたはconcurrent_queueをソートする方法は?

これで、concurrent_vector または queue に一連の自己定義データ型オブジェクトを保持する必要があるソルバーができました。オブジェクトは異なるスレッドから取得されるため、並行処理する必要があります。この並行コンテナーを使用して、これらのオブジェクトを並べ替え、重複を排除し、他のスレッドがそれらを必要とするときにそれらを送り返したいと考えています。

ただし、TBB が、異なるスレッドから同時に読み書きできる concurrent_vector と concurrent_queue を提供していることは知っています。しかし、コンテナ内のオブジェクトをソートするにはどうすればよいでしょうか? 誰もがそれを行う方法を知っていますか? ありがとう。

0 投票する
1 に答える
1062 参照

c++ - tbb::concurrent_vector が間違ったサイズを返す

私はTBB フォーラムでこの質問をしましたが、ここの誰かが追加の考えを持っていることを願っています. 発生している問題をデバッグしていたところ、 の奇妙な動作に気付きましたtbb::concurrent_vector

push_back()肝心なのは、呼び出しが実際に完了した後、size()の にconcurrent_vectorはこれが反映されないということです。capacity()と をキャプチャするとsize()、実際の要素数ではなく容量が返さsize() == capacity() => trueれると思われるため、容量に関連するように絞り込みました。size()

この問題を再現する簡単なプログラムを作成しました。この問題は、ベクターが空のときに最も頻繁にトリガーされます。簡単にするために、このプログラムは、呼び出しが返さsize() != 0れた直後に単純にアサートします。push_back()これが予想される動作なのか、それともバグなのか、誰かが教えてくれることを願っています。

彼らのリファレンスマニュアルによると:

push_back() "ベクターの末尾に値のコピーを追加します。"

size() は、「ベクター内の要素の数。結果には、いずれかの成長メソッド (5.6.3) への同時呼び出しによって割り当てられているが、まだ構築中の要素が含まれる場合があります。」

これに基づいて、少なくとも一度のリターンを反映するsize()必要があると思います。push_back()push_back()

0 投票する
2 に答える
2712 参照

c++ - 2次元配列のconcurrent_vector

現在、 を使用して 2D 配列を表現しようとしていtbb::concurrent_vector<T>ます。この 2 次元配列は、多くの異なるスレッドによってアクセスされるため、並列アクセスを可能な限り効率的に処理する必要があります。

私は2つの解決策を思いつきました:

  • を使用しtbb::concurrent_vector<tbb::concurrent_vector<T> >て保管してください。

  • すべてを a に格納し、tbb::concurrent_vector<T>w/ で要素にアクセスします。x * width + y

1 つの要素にアクセスするために行全体をロックしたくないため、2 番目の要素を好みました (要素にアクセスするためarray[x][y]に tbb 実装はxth 行をロックし、次にyth 要素をロックすると想定しているため)。

どの解決策があなたにとってより良いと思われるか知りたいです。

0 投票する
1 に答える
294 参照

concurrency - Microsoft PPL ライブラリ: concurrent_vector push_back データは 1 回のみ

Concurrency::concurrent_vector があり、まだ存在しない場合にのみ新しい要素をスレッドセーフにプッシュバックしたい (そのため、最初に検索を実行する必要があります)。どうすればこれを達成できますか? イテレータアクセス(書き込み、同じ要素の読み取り)でスレッドセーフであり、上記で書いたものも許可する並行コレクションが必要です。

質問の絞り込み: ほとんどが同時に検索される場合、使用するのに最適なコンテナーは何でしょうか。要素が見つからない場合 (よりまれ)、insert/push_back が必要になり、検索要素が見つかった場合 (ほとんどの場合) は要素に更新されます。が必要です(同じ反復子の同時更新)

VS2010 で既に利用可能なものから、concurrent_vector を見ましたが、同じ要素を更新するのは安全ではなく、要素が見つからない場合に備えて追加のロックが必要であり、そのために要素を追加する必要があるようです。どう思いますか ?外部ロック (コンテナ全体のロック) を排除するために使用できるものはありますか?

0 投票する
2 に答える
5625 参照

c++ - ロックフリーのベクター実装はありますか?

Google での "lock free vector" の最初の結果は、Damian Dechev、Peter Pirkelbauer、および Bjarne Stroustrup が共同執筆した研究論文で、理論的なロックフリー ベクトルについて説明しています。これ、または他のロックフリーのベクトルは実装されていますか?

0 投票する
1 に答える
334 参照

vector - tbb - メモリへのconcurrent_vectorアドレス?

concurrent_vectorと同様の方法で、TBB (Threaded Building Blocks)の a のメモリへの参照を取得しようとしていますstd::vector

したがって、std::vectorは次のようにアクセスされます&stdVector[0]

しかし、 a に相当するものはconcurrent_vector機能しません: &tbbVector[0].

これは、同時実行のためにメモリが内部に格納される方法に関係があると思いますが、これを行う方法はありますか?

0 投票する
2 に答える
250 参照

c++ - concurrent_vector 無効なデータ

使用: VC++ 2013

ときどきdtnodelst->at(i)....無効なアドレス(0XCDCD .. ofc)を取得していますが、これはプッシュバックした後に原因ではないはずです。アイテムを削除したり削除したりしません(削除しても削除された古いアドレスを返しました...しかし、私は削除していないので、そうではありません)

何が起こっているのかについてのアイデアはありますか?

ps Windows スレッド プールを使用しています。時々.. 800万回の挿入と検索を実行でき、すべてがうまくいきます..しかし、時には200回の挿入と検索でさえ失敗します。私はちょっと迷っています。どんな助けでも大歓迎です!!

よろしくお願いします

参考までに実際のコード

ps何か足りないのですか、それとも適切なフォーマットでコードを過去にするのは面倒ですか? 以前はオートアラインだったのを覚えています... -_-

0 投票する
1 に答える
360 参照

c++ - tbb concurrent_vectors を連結しますか?

組み合わせる必要がある複数の大きな Intel TBB の concurrent_vectors があります。これらは非常に大きいため、適切なサイズの新しい concurrent_vector を割り当てることはできません。

...したがって、次の疑似コードは機能しません

私がしたいのは、[A]、[B]...[X] が [AB...X] になるように、最初のベクトルのセットを組み合わせたものに転送または交換することです。tbb が 1 つのベクトルの swap() をサポートしていることは知っていますが、複数のベクトルをスワップまたは追加する方法がわかりません。誰かが私を正しい方向に向けることができますか? 前もって感謝します!!

0 投票する
1 に答える
1355 参照

c++ - ミューテックスでのconcurrent_vectorとvector、push_backでのスレッドの問題

複数のタスクによって処理されているオブジェクトがあります。このオブジェクトを複数回コピーし、タスクのベクターに格納して、それ自体のコピーを取得し、parallel_for ループで処理します。以下は、標準ベクトルを使用したコードです。

アイデアは、サイズ 0 のベクトルから始めて、並行して起動され、独自のコピーが必要なタスクの数に応じて成長させるというものです。アトミックな「_poolIndex」を使用して、実行ごとのグローバル インデックスを追跡します。

デバッガーが壊れたときに位置 < サイズであっても、ベクター クラスの以下のコードで範囲外のインデックスを取得します。

明らかに、 size() <= _Pos を取得する部分は何か違うものを評価しました...ベクトルへのプッシュをロックしているため、混乱しています。

次に、concurrent_vector を試してみましたが、push_back によってコンパイルの問題が発生しました。Visual Studio 2013 のエラーは次のとおりです。

エラー 35 エラー C2059: 構文エラー: '&' c:\program files (x86)\microsoft visual studio 12.0\vc\include\concurrent_vector.h 1492 1 UnitTests

エラー 36 エラー C2143: 構文エラー: ';' がありません ')' の前に c:\program files (x86)\microsoft visual studio 12.0\vc\include\concurrent_vector.h 1492 1 UnitTests

また、concurrent_vector クラスでは、_objectPool を vector から concurrent_vector に切り替えると問題が発生するコードを次に示します。

上記の2つの問題について誰かがガイダンスを提供できれば、それは素晴らしいことです。

また、効率を高めるためにクリティカル セクションを最小限に抑えようとしています。アイデアは、アルゴリズムを起動して何度も実行した後、_objectPool のすべてではないにしてもほとんどのコピーが既にベクターにプッシュされていることです。