У меня есть многопоточное приложение на C ++ для Windows 7. Это приложение скомпилировано как DLL для использования другого приложения C #.
Я запускаю многопоточный код в течение долгих часов для обработки потоковых данных. Если я скомпилирую этот код C ++ в автономный .exe-файл и выполню код, он будет работать нормально.
Но когда он превращается в DLL и когда код C # запускается вместе с ним, программа вылетает с ошибкой Access Violation после длительных запусков.
Я вижу похожий сбой, когда загружаю DLL из скрипта Python и запускаю ее в течение долгих часов.
Когда я наблюдаю за поведением с помощью диспетчера задач, я вижу, что подсчет системных дескрипторов растет очень быстро. Примерно после 2 часов выполнения кода, я вижу, что счетчик дескрипторов пересекает отметку 300 000, и он продолжает расти.
Внутри многопоточного кода потоки создаются и постоянно отключаются. Я вижу, что после завершения потока дескриптор потока не закрывается явно функцией CloseHandle. Может ли это быть потенциальной проблемой?
Как мне подтвердить, что это проблема с ручками? Как лучше отслеживать эти системные ресурсы?
Прежде чем пытаться что-либо исправить, я хотел бы узнать все возможные решения, поскольку тестовые прогоны занимают много времени, более 5 часов, чтобы воспроизвести аварию.
SysInternals Process Explorer может просматривать дескрипторы в процессе и идентифицировать их как дескрипторы потока, мьютекса, файла и т. д. Вы определенно должны CloseHandle () каждый дескриптор потока, чтобы очистить их.
Кроме того, создание потока является дорогостоящей операцией. Если вы создаете много заданий с потоками, лучше поставить их в очередь и создать пул из ограниченного числа потоков (обычно примерно равных количеству процессоров в системе), которые извлекают из очереди и выполняют задание.
Других решений пока нет …