gpt4 book ai didi

c++ - Visual C++ parallel_for + vector 访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:46 28 4
gpt4 key购买 nike

我正在尝试将循环通过 ~12,000x12,000 单元格矩阵(大约 125 次)的过程转换为使用并行处理(通过 parallel_for )。我正在使用的代码如下。你可以看到 for 循环被注释掉的地方。

当我用 for 循环运行这段代码时,没有任何问题。当我使用 parallel_for 运行它(调试)时,它在随机点崩溃,出现“FratarProcess.exe 0xC0000005 中 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 使用同步保护。在不使用同步的情况下改变容器、打印到输出,甚至从多个线程同时增加共享变量都是不安全的。

关于c++ - Visual C++ parallel_for + vector 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932959/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com