Обработка ограничений в приложении Win 7

У меня есть многопоточное приложение на C ++ для Windows 7. Это приложение скомпилировано как DLL для использования другого приложения C #.

Я запускаю многопоточный код в течение долгих часов для обработки потоковых данных. Если я скомпилирую этот код C ++ в автономный .exe-файл и выполню код, он будет работать нормально.

Но когда он превращается в DLL и когда код C # запускается вместе с ним, программа вылетает с ошибкой Access Violation после длительных запусков.
Я вижу похожий сбой, когда загружаю DLL из скрипта Python и запускаю ее в течение долгих часов.

Когда я наблюдаю за поведением с помощью диспетчера задач, я вижу, что подсчет системных дескрипторов растет очень быстро. Примерно после 2 часов выполнения кода, я вижу, что счетчик дескрипторов пересекает отметку 300 000, и он продолжает расти.

Внутри многопоточного кода потоки создаются и постоянно отключаются. Я вижу, что после завершения потока дескриптор потока не закрывается явно функцией CloseHandle. Может ли это быть потенциальной проблемой?

Как мне подтвердить, что это проблема с ручками? Как лучше отслеживать эти системные ресурсы?
Прежде чем пытаться что-либо исправить, я хотел бы узнать все возможные решения, поскольку тестовые прогоны занимают много времени, более 5 часов, чтобы воспроизвести аварию.

0

Решение

SysInternals Process Explorer может просматривать дескрипторы в процессе и идентифицировать их как дескрипторы потока, мьютекса, файла и т. д. Вы определенно должны CloseHandle () каждый дескриптор потока, чтобы очистить их.

Кроме того, создание потока является дорогостоящей операцией. Если вы создаете много заданий с потоками, лучше поставить их в очередь и создать пул из ограниченного числа потоков (обычно примерно равных количеству процессоров в системе), которые извлекают из очереди и выполняют задание.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]