2014-04-12 2 views
0

Windows 7 용 C++에서 멀티 스레드 응용 프로그램이 있습니다.이 응용 프로그램은 다른 C# 응용 프로그램을 사용하기위한 DLL로 컴파일됩니다.Win 7 응용 프로그램의 핸들 제한

스트리밍 데이터를 처리하는 데 오랜 시간 동안 다중 스레드 코드를 실행합니다. 이 C++ 코드를 독립 실행 형 .exe로 컴파일하고 코드를 실행하면 정상적으로 작동합니다.

그러나 DLL로 바뀌고 C# 코드가 함께 실행되면 프로그램을 장기간 실행하면 액세스 위반 오류로 인해 충돌합니다. Python 스크립트에서 DLL을로드하고 장시간 실행하면 비슷한 오류가 발생합니다.

작업 관리자를 사용하여 동작을 볼 때 정말 빠른 속도로 증가하는 시스템 핸들 수가 나타납니다. 약 2 시간 동안 코드를 실행 한 후, 핸들 수는 300,000을 넘었고 계속 증가합니다.

다중 스레드 코드 내에서 스레드가 생성되고 연속적으로 숨김 상태가됩니다. 스레드가 종료 된 후에는 스레드 핸들이 CloseHandle 함수에 의해 명시 적으로 닫히지 않습니다. 이것이 잠재적 인 문제가 될 수 있습니까?

핸들 문제인지 어떻게 확인합니까? 이러한 시스템 리소스를보다 나은 방법으로 시청하는 방법은 무엇입니까? 수정하기 전에 테스트를 실행하는 데 5 시간 이상이 걸릴 수 있으므로 가능한 모든 해결책을 알고 싶습니다.

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85) .aspx)에 따르면 : _ 스레드 개체는 시스템에 남아있을 때까지 시스템에 남아 있습니다. 스레드가 종료되었고 CloseHandle에 대한 호출을 통해 모든 핸들이 닫혔습니다. _ –

+1

도구에 대한 권장 사항을 묻는 질문이므로 질문이 닫힐 수 있습니다. 원인을 찾는 도구가 아닌 원인을 재검토하기 위해 편집 할 수 있습니다. 그 동안 DLL이 언로드되지 않을 때 프로세스가 끝날 때 리소스가 Windows에서 해제되기 때문에 핸들 누수가 발생할 수 있습니다. –

+0

핸들이 닫히지 않은 경우 (스레드가 작성된 후나 닫힌 경우) 버그가 발생하여 분명히 증상을 설명 할 수 있습니다. 내가 너라면 버그를 먼저 해결할 것이고, 증상이 계속되면 추가로 문제를 해결하는 것에 대해서만 걱정할 것이다. –

답변

1

SysInternals Process Explorer은 프로세스에서 핸들을보고 스레드, 뮤텍스, 파일 등의 핸들로 식별 할 수 있습니다. CloseHandle()을 사용하여 각 스레드 핸들을 정리해야합니다.

제쳐두고 스레드를 만드는 것은 비용이 많이 드는 작업입니다. 많은 스레드 작업을 작성하는 경우 작업을 대기열에 넣고 큐에서 당겨 작업을 수행하는 제한된 수의 스레드 풀 (일반적으로 시스템의 CPU 수와 거의 같습니다)을 만드는 것이 좋습니다.

관련 문제