Учитывая, что ваш код многопоточный (на самом деле, многоядерный) и сбой непредсказуем, я бы сказал, что прерывание предварительной выборки почти наверняка вызвано повреждением памяти из-за гонки.
Может помочь, если вы сможете узнать, где генерируется прерывание.Подобные ошибки очень сложно отследить;если код всегда дает сбой в одном и том же месте, это может помочь, но даже если это произойдет, и вы сможете выяснить, какой адрес подвержен повреждению, отслеживание этого адреса на предмет мошеннических записей не влияет на время выполнения программы (и, следовательно, на проявлениеошибка) по существу невозможна.
Вполне вероятно, что основной причиной является переполнение буфера, особенно учитывая ваши комментарии выше.На самом деле вы должны заранее знать, насколько большими должны быть ваши буферы, а затем сделать их такого размера.Если какой-либо алгоритм, который вы используете, не может гарантировать ограничение на объем используемого буфера, вы должны добавить код, который выполняет проверку буфера во время выполнения и реагирует соответствующим образом (возможно, хорошо сообщенная ошибка, чтобы вы знали, какой буфер переполнен),Использование кучи - это нормально, но объявление большого буфера как static
быстрее и без утечек, при условии, что функция, содержащая буфер, не реентерабельна.
Если в миксе тоже есть гонки доступа к данным, обратите вниманиечто для их решения вам понадобятся не только инструкции по защите данных.Инструкции по защите данных только решают проблемы согласованности, связанные с незавершенными транзакциями памяти.Они не препятствуют кешированию регистров совместно используемых данных (для этого вам нужно ключевое слово volatile
) или одновременным гонкам чтения-изменения-записи (для этого нужны механизмы взаимного исключения, предоставляемые любой используемой платформой или домашней версией).-приготовлено с использованием инструкций STREX
и LDREX
на armv7).