2012-05-28 3 views
0

최근에 Windows 7 x64에서 이전 응용 프로그램 (Borland C++ Builder 6으로 작성)을 실행하려고 시도했지만 IO 스레드가 작동하지 않는 것으로 나타났습니다. 디버깅은 오류 처리 클래스에서 중요한 섹션 (단순한 래퍼 클래스를 통해 간접적으로)을 벗어나지 않아서 로그에 추가 된 모든 메시지가 EnterCriticalSection이라는 두 번의 호출을 야기했지만 LeaveCriticalSection의 한 번의 호출 만 발생했음을 보여주었습니다.Windows 2000/XP의 중요 섹션과 관련된 잘못된 동작

이 오류는 클래스를 사용할 수 없게 만들지 만 원본 개발자가 적극적으로 사용하는 일반적인 클래스 중 하나이며이 특정 응용 프로그램은 Windows 2000/XP에서 항상 올바르게 작동합니다. 따라서이 오류가 Windows 7에서만 나타나는 이유는 무엇입니까?

중요한 섹션 및 제안 된 질문에 대한 MSDN 기사를 읽었습니다. 여기서 언급 한 유일한 동작 변경은 주문을 얻지 못하는 것입니다.

답변

1

저는 C++ Builder 6을 사용하고 Windows 7 64 비트의 중요한 섹션에서는 내 응용 프로그램이 잘 작동합니다. 따라서 문제는 API가 아닌 앱의 버그 때문입니다. 스레드가 EnterCriticalSection()을 호출하고 잠금을 성공적으로 획득하지만 LeaveCriticalSection()을 호출하지 않으면 후속 스레드는 자신의 호출에서 교착 상태가 발생하여 EnterCriticalSection()으로 교착 상태가됩니다. 따라서 디버깅을 계속하여 원래 스레드가 가정 된 때 LeaveCriticalSection()을 호출하지 않은 이유를 파악해야합니다. EnterCriticalSection()에 대한 모든 호출은 특히 중첩 된 경우 LeaveCriticalSection()에 대한 호출과 균형을 이루어야합니다.

+0

답변이 아닙니다. –

+0

나는 이미 (LeaveCriticalSection()의 누락 된) 문제를 발견하고 고쳤다. 내가 뭘 알고 싶은 이유는 그것이 분명히해서는 안되는 이전 Windows 버전에서 작동합니다. –

+1

작동 방식이 없습니다. 'LeaveCriticalSection()'을 호출하지 않으면 잠금을 얻으려는 다른 스레드가 교착 상태가됩니다. 이 동작은 모든 Windows 버전에서 동일합니다. –