我有一个正在由多个任务处理的对象。我多次复制这个对象并存储在一个任务的向量中,以检索它自己的副本以在 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];
}
我在向量类的以下代码中得到索引超出范围,即使当调试器中断时 position < size :
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));
}
如果有人可以就上述两个问题提供指导,那就太好了。
我还试图最小化关键部分以提高效率。这个想法是在启动算法并多次运行之后,_objectPool 将拥有大部分(如果不是全部)副本已经推送到向量上。