我試圖轉換一個進程,通過~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;',並且它可以運行一個測試。到現在爲止還挺好。感謝您讓我指出正確的方向。 –