複数のタスクによって処理されているオブジェクトがあります。このオブジェクトを複数回コピーし、タスクのベクターに格納して、それ自体のコピーを取得し、parallel_for ループで処理します。以下は、標準ベクトルを使用したコードです。
アイデアは、サイズ 0 のベクトルから始めて、並行して起動され、独自のコピーが必要なタスクの数に応じて成長させるというものです。アトミックな「_poolIndex」を使用して、実行ごとのグローバル インデックスを追跡します。
Object& GetObject()
{
if (_poolIndex >= _objectPool.size())
{
lock_guard<mutex> lock(_mutex);
Object copy(_original);
_objectPool.push_back(move(copy));
}
int taskIndex = _poolIndex.fetch_add(1);
return _objectPool[taskIndex];
}
デバッガーが壊れたときに位置 < サイズであっても、ベクター クラスの以下のコードで範囲外のインデックスを取得します。
reference operator[](size_type _Pos)
{ // subscript mutable sequence
#if _ITERATOR_DEBUG_LEVEL == 2
if (size() <= _Pos)
{ // report error
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
明らかに、 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 に切り替えると問題が発生するコードを次に示します。
void _Init(const void *_Src)
{
for(; _I < _N; ++_I)
new( &_My_array[_I] ) _Ty(*static_cast<const _Ty*>(_Src));
}
上記の2つの問題について誰かがガイダンスを提供できれば、それは素晴らしいことです。
また、効率を高めるためにクリティカル セクションを最小限に抑えようとしています。アイデアは、アルゴリズムを起動して何度も実行した後、_objectPool のすべてではないにしてもほとんどのコピーが既にベクターにプッシュされていることです。