C++ glBindBuffer上的访问冲突

C++ glBindBuffer上的访问冲突,c++,multithreading,opengl,access-violation,C++,Multithreading,Opengl,Access Violation,我使用OpenGL开发一个程序已经有一段时间了,最近我开始在这一行中偶尔遇到一个错误: glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexID); 下面是出现的错误,尽管我认为这不会有太大帮助: 在中的0x0000000069E03C13(nvoglv64.dll)处首次出现异常 Voxel.exe:0xC0000005:访问冲突读取位置 0x000000000AA87000 为访问冲突指定的地址不同,冲突发生所需的时间也不同。考虑到发生访问冲突所需的时

我使用OpenGL开发一个程序已经有一段时间了,最近我开始在这一行中偶尔遇到一个错误:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexID);
下面是出现的错误,尽管我认为这不会有太大帮助:

在中的
0x0000000069E03C13
(nvoglv64.dll)处首次出现异常 Voxel.exe:
0xC0000005
:访问冲突读取位置
0x000000000AA87000

为访问冲突指定的地址不同,冲突发生所需的时间也不同。考虑到发生访问冲突所需的时间各不相同,我猜这与两个线程试图访问相同的数据有关,但是当发生冲突时,没有任何其他线程在同一对象上工作,我使用互斥锁来确保两个线程不能写入相同的数据。我已经检查并确保索引缓冲区的ID是有效的,并且由于生成和删除缓冲区ID的唯一线程也是将数据绑定和传输到缓冲区的唯一线程,因此我认为访问冲突不可能是因为这个原因

我如何追踪和/或修复导致此访问冲突的原因

我猜这与两个线程试图访问相同的数据有关

这将被称为比赛条件。种族条件不会导致访问冲突

我的最佳选择是,您从多个线程使用OpenGL,并且只为一个线程初始化扩展。Windows在OpenGL扩展和线程方面有点棘手:函数指针在上下文和线程之间可能有所不同。如果使用为不同上下文和/或线程初始化的函数指针,则会发生这种情况


确保扩展加载机制正确处理多线程和上下文。

并且m_indexID有效/正确?每次我遇到访问冲突时,m_indexID都是有效的。好的,如果不使用多线程,问题会消失吗?调用此函数时是否有活动的OpenGL上下文/窗口?i、 e.您是否将调用线程的上下文设置为“当前”上下文?正如我所见,您有nvidia gfx(OpenGL的最佳选择),因此我怀疑是否存在与驱动程序相关的问题。什么操作系统,你有多少上下文。。。?井手使用的是什么?(我使用BDS2006 C++,它从哪里调用什么函数)也有类似的问题,GLYELMENTYARALYAYLASH绑定一次(源代码中的init位置的改变解决了)哎哟,我想我说错了。我的意思是两个线程试图更改相同的数据,或者同时添加到一个向量。这可能会导致访问冲突,不是吗?@Shadow:在同一位置修改值:不,这只会导致数据损坏,而不是访问冲突。添加到向量如果向量数据结构及其访问函数不可重入,则有可能产生访问冲突(这也是C++11内置线程原语的原因之一,因此数据结构可以重入实现,而不依赖于特定于操作系统的API)。感谢您的澄清。因此,两个线程写入同一个变量可能导致访问冲突的唯一时间是,如果第一个线程导致向量在内存中移动以调整自身大小,那么另一个线程尝试写入向量使用的区域?@Shadow:正是这样。这是fre之后的经典用法e竞争条件。在具有显式内存管理的程序中,它会很快触发异常。但在具有隐式内存管理的环境中,它们可能会成为非常微妙的错误。例如,当使用垃圾收集器时,可能会写入其他位置(取决于GC的工作方式)创建一个访问转移,@Shadow:e.内存位置被移动,但旧位置发生写入,而旧位置不会立即被清除;它在一段时间内保持“稳定”,直到GC启动并不仅清除向量的丢弃内存,而且清除由于竞争条件写入该部分的“新”引用。