1

这是设置。我创建了一个全局变量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;
        }
4

0 回答 0