Нарушение доступа в glBindBuffer

Я некоторое время работал над программой, использующей OpenGL, и недавно я начал иногда получать ошибку в этой строке:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexID);

Вот ошибка, которая появляется, хотя я не думаю, что это поможет слишком сильно:

Исключение первого шанса в 0x0000000069E03C13 (nvoglv64.dll) в Voxel.exe: 0xC0000005: Место чтения нарушения доступа 0x000000000AA87000,

Адрес, указанный для нарушения доступа, варьируется, и время, которое требуется для нарушения, также изменяется. Учитывая, что время, необходимое для нарушения прав доступа, варьируется, я предполагаю, что это связано с двумя потоками, пытающимися получить доступ к одним и тем же данным, но никогда не будет никакого другого потока, работающего над тем же объектом, когда происходит нарушение, и я Я использую мьютексы, чтобы убедиться, что два потока не могут записывать в одни и те же данные. Я проверил и убедился, что идентификатор для индексного буфера действителен, и поскольку единственный поток, который генерирует и удаляет идентификаторы буфера, также является единственным потоком, который связывает и передает данные в буферы, я не верю, что это возможно для нарушение доступа должно быть из-за этого.

Как я могу отследить и / или устранить причину нарушения прав доступа?

1 ответ

Я предполагаю, что это связано с двумя потоками, пытающимися получить доступ к одним и тем же данным,

Это можно назвать условием гонки. Гоночные условия не вызывают нарушения доступа!

Лучше всего, если вы используете OpenGL из нескольких потоков и инициализируете расширения только для одного. Windows немного сложнее, когда дело доходит до расширений OpenGL и потоков: указатели на функции могут различаться в зависимости от контекста и потока. И если вы используете make, используйте указатель на функцию, инициализированный для другого контекста и / или потока, это произойдет.

Убедитесь, что ваш механизм загрузки расширений правильно работает с несколькими потоками и контекстами.

Другие вопросы по тегам