(非常に)大きなベクトルをとり、その中のすべての値を多次元(2D)ベクトルに再割り当てしようとしています。多次元ベクトルの子要素内の要素にスレッドセーフで書き込むことはできますか?
多次元ベクトルは、再配置を避けるために、値の集計に先立って両方のディメンションが正しいサイズにサイズ変更されています。
現在、私はそれをシングルスレッド化していますが、繰り返し発生する必要があり、大きなサイズ(〜7秒)のために非常に遅いです。問題は、例えば2D要素ごとのスレッドなど、スレッドセーフであるかどうかです。
いくつかの擬似コード:
vector<string> source{/*assume that it is populated by 8,000,000 strings
of varying length*/};
vector<vector<string>> destination;
destination.resize(8);
for(loop=0;loop<8;loop++)destination[loop].resize(1000000);
//current style
for(loop=0;loop<source.size();loop++)destination[loop/1000000][loop%1000000]=source[loop];
//desired style
void Populate(int index){
for(loop=0;loop<destination[index].size();loop++)destination[index][loop]=source[index*1000000+loop];
}
for(loop=0;loop<8;loop++)boost::thread populator(populate,loop);
彼らは第二次元の要素を分離するために書いているので、私は、ネジ付きバージョンが動作する必要があることをを思うだろう。しかし、私は文字列を書くことがサイズ変更されているので、物事を壊すかどうかはわかりません。
コメントありがとうございました。ありがとうございました。すべてのコメントと、いくつかの注目を集めてくれました。 私の場合、各スレッドは2Dベクトルの全体の分岐を取得するので、範囲の衝突についての心配はありませんが、他の場合について知っておくとよいでしょう。 メモリとキャッシュの問題については、自分の状況で効率を判断するためにテストする必要があります。しかし、マルチスレッド化は必ずしも魅力的なことではないことを指摘することは良いことです。 –