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