Нарушение доступа в glBindBuffer
Я некоторое время работал над программой, использующей OpenGL, и недавно я начал иногда получать ошибку в этой строке:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexID);
Вот ошибка, которая появляется, хотя я не думаю, что это поможет слишком сильно:
Исключение первого шанса в
0x0000000069E03C13
(nvoglv64.dll) в Voxel.exe:0xC0000005
: Место чтения нарушения доступа0x000000000AA87000
,
Адрес, указанный для нарушения доступа, варьируется, и время, которое требуется для нарушения, также изменяется. Учитывая, что время, необходимое для нарушения прав доступа, варьируется, я предполагаю, что это связано с двумя потоками, пытающимися получить доступ к одним и тем же данным, но никогда не будет никакого другого потока, работающего над тем же объектом, когда происходит нарушение, и я Я использую мьютексы, чтобы убедиться, что два потока не могут записывать в одни и те же данные. Я проверил и убедился, что идентификатор для индексного буфера действителен, и поскольку единственный поток, который генерирует и удаляет идентификаторы буфера, также является единственным потоком, который связывает и передает данные в буферы, я не верю, что это возможно для нарушение доступа должно быть из-за этого.
Как я могу отследить и / или устранить причину нарушения прав доступа?
1 ответ
Я предполагаю, что это связано с двумя потоками, пытающимися получить доступ к одним и тем же данным,
Это можно назвать условием гонки. Гоночные условия не вызывают нарушения доступа!
Лучше всего, если вы используете OpenGL из нескольких потоков и инициализируете расширения только для одного. Windows немного сложнее, когда дело доходит до расширений OpenGL и потоков: указатели на функции могут различаться в зависимости от контекста и потока. И если вы используете make, используйте указатель на функцию, инициализированный для другого контекста и / или потока, это произойдет.
Убедитесь, что ваш механизм загрузки расширений правильно работает с несколькими потоками и контекстами.