我试图转换一个进程,通过~12,000x12,000单元矩阵(大约125次)循环使用并行处理(通过parallel_for
)。我正在使用的代码如下。你可以看到for循环被注释掉的地方。Visual C++ parallel_for +向量访问冲突
当我用for循环运行这段代码时,没有任何问题。当我使用parallel_for
运行(调试),它崩溃在与“未处理的异常随机点在FratarProcess.exe 0000005 0x00f3d4ae:访问冲突写入位置0x0000000
注:accessMatrix
被声明为vector <vector <unsigned short> > accessMatrix;
和之前充满这点。
void dumpMatrix(unsigned short m)
{
int complete=0, start=2532, todo=accessMatrix.size()-start;
vector <string> sqlStrings;
Concurrency::parallel_for(start, (int)accessMatrix.size(),[&complete,&todo,&m,&sqlStrings](int i)
//for(int i=start;i<accessMatrix.size();i++)
{
printf("Processing i=%i... completed %i/%i\n",i,complete,todo);
for(unsigned short j=1;j<accessMatrix[i].size();j++)
{
if(accessMatrix[i][j]>0)
{
stringstream strSQL;
strSQL << "INSERT INTO debug.dbf (I,J,M,V) VALUES(" << i << "," << j << "," << m << "," << accessMatrix[i][j] << ")";
sqlStrings.push_back(strSQL.str());
}
}
complete++;
});
...
}
有人可以帮我在正确的方向,所以我可以使用,而不是我的一个机器的所有8个内核得到这个过程吗?请注意,我是位于C新手有点++的。我使用Visual C++ Express。
好吧,所以在阅读你的答案并做了一些更多的研究之后,看起来我应该将sqlStrings声明为'Concurrency :: concurrent_vector sqlStrings;',并且它可以运行一个测试。到现在为止还挺好。感谢您让我指出正确的方向。 –