线程完成时访问冲突

时间:2013-04-16 18:21:47

标签: multithreading pointers multidimensional-array

这是设置。 我创建了一个全局变量GLfloat ***terrainMap; 接下来,在主线程函数中,我将其初始化为

    terrainMap = new GLfloat**[size+1];
for(int i = 0; i < size+1; i++)
{
terrainMap[i] = new GLfloat*[size+1];
for(int j = 0; j < size+1; j++)
{
  terrainMap[i][j] = new GLfloat[4];
}
}
然后我先将它传递给两个对象,以便他们可以写入和读取原始数据。

current.AddObject(new Terrain(1,0.5f,terrainMap));
current.AddObject(new Grass(2,terrainMap));

Terrain::Terrain(int tag1,float smoothnessInclination1,GLfloat ***terrainMap1){
terrainMap= terrainMap1;

Grass::Grass(int tag1,GLfloat ***terrainMap1){
terrainMapG=terrainMap1;

在这一点上,我觉得自己非常信任,因为在不同的线程中写入数据

terrainMap[i][c][0] = ((hold.x+1)/2.0f)*255;
terrainMap[i][c][1] = ((hold.y+1)/2.0f)*255;
terrainMap[i][c][2] = ((hold.z+1)/2.0f)*255;
terrainMap[i][c][3] = vertexData[(i*(size+1))+(c)].XYZW[1];

和不同线程中的数据读取

+terrainMapG[i][c][3]

运作良好。 但是,当线程本身结束时。发生了访问冲突,我不知道如何。

这是分离的线程

void LoadObjects(){
for(std::vector<int>::size_type i = 0;i != current.storage.size();i++){
    current.storage.at(i)->Load();
}
runLoad=false;
}

我知道我不是在同时阅读和写入数据,那么它会是什么?

编辑: 将size的值从1000减小到100后,将引发新错误。 Unhandled exception at 0x0000000076EE40F2 (ntdll.dll) in Procedural Terrain.exe: 0xC0000374: A heap has been corrupted (parameters: 0x0000000076F5B450).代替原来的Unhandled exception at 0x00000000694E0760 (nvoglv64.dll) in Procedural Terrain.exe: 0xC0000005: Access violation reading location 0x0000000002770258.

此外,在size = 100的错误之前,程序停止并显示它在realloc.c中遇到断点的错误,其中我没有在代码处设置断点

pvReturn = NULL;
        if (newsize <= _HEAP_MAXREQ)
        {
            if (newsize == 0)
                newsize = 1;
            pvReturn = HeapReAlloc(_crtheap, 0, pBlock, newsize);
        }
        else
        {
            _callnewh(newsize);
            errno = ENOMEM;
            return NULL;
        }

0 个答案:

没有答案