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