Iは、複数のスレッドからfloat
Sを計算し、次のように同じvector<float>
の非重複範囲内に結果を格納しています:同じベクターの異なる範囲に対して複数のスレッドからstd :: copyを呼び出すことは安全ですか?
を私はそれがvector::reserve
を使用して事前に割り当てられたスレッドのいずれかを実行する前に。各スレッドで
vector
を計算し、このようなターゲットコンテナにコピーされます。
vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy(localVector.begin(), localVector.end(), destination);
これは安全な練習ですか?ベクトルは大きさを固定している(と、それはあなたの質問から持っているようにそれはそう)、および範囲は、その後、重複していない場合
'std :: vector :: reserve'は実行しません。実際には' resize() 'する必要があります。そうしないと、ベクトルの実際の' end() 'を超えて書き込みます。 – mindriot
@mindriotコメントに追加するには:格納している型にデフォルトのコンストラクタがない場合は、直接型の代わりに 'boost :: optional'のようなものを使うことができます。これは、自分自身を完全に構築していない「まだ実際ではない」オブジェクトの1つを作成せずに何かが失敗したかどうかを知ることができるという利点をもたらしました。それらは嫌悪感です。 –