2

複数のタスクによって処理されているオブジェクトがあります。このオブジェクトを複数回コピーし、タスクのベクターに格納して、それ自体のコピーを取得し、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 のすべてではないにしてもほとんどのコピーが既にベクターにプッシュされていることです。

4

1 に答える 1