2012-06-22 3 views
1

우리는 다중 스레드 응용 프로그램을 가지고 있습니다. 작업자 스레드 중 하나가 로깅 목적을 위해 GetModuleFilename을 호출하고 우리는 영원히 차단하는 GetModuleFilename을 호출하기 전에 작업자 스레드가 잠금을 유지하는 교착 상태를 보았습니다.getmodulefilename 블록을 켤 수 있습니까?

이 잠금 내부에서 GetModuleFilename 호출을 제거 할 수는 있지만 교착 상태가 발생하는 방식에 대해서는 여전히 관심이 많습니다.

온라인 약간의 독서를하는 : http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx

하여 GetModuleFileName이 교착 상태에 대한 꽤 좋은 후보처럼 듯 loaderlock을 획득 할 것으로 보인다.

그러나 일반적으로 위의 링크에 따라 dllmain을 제외하고는 loaderlock 내부의 스레드는 우리 자신의 코드를 실행하지 않습니다.

der_thread_attach 또는 detach가 loaderlock 및 생성되거나 파괴되는 다른 workerthread에서 호출 될 수 있지만 사용중인 잠금을 획득하려고 시도하는 방법이 표시되지 않습니다.

메인 스레드가 GetModuleFilename 스레드가 보유하고있는 잠금을 획득하려고 시도하고 제 3 스레드가 로더 잠금을 보유하고 있고 메인 스레드에서 블로킹과 같은 sendmessage를 수행하고있을 가능성이 있습니다? 여기에도 나는이 일이 일어날 어떤 상황도 발견하지 못했다.

내가 의심하는 다른 스레드 중 하나는 com 개체를 사용하는 스레드입니다. 스레드가 처음에 coinitialize를 호출하여 단일 스레드 아파트에 있어야합니다. 여기에 loaderlock과의 상호 작용 가능성?

어쨌든 우리는이 교착 상태가 발생하는 정확한 방법을 식별하지 못했습니다. 그래서 몇 가지 아이디어가 필요하거나, 다른 경우의면에서 로더 락에 대한 좀 더 자세한 정보를 얻으려는 것이고, 차단할 가능성이있는 로더 락 내에서 코드가 실행되는 다른 시나리오가있는 경우입니다.

감사합니다.

답변

0

를 참조, 내가 설명하는 문제는 단지 우리가 사용하는 라이브러리에서 다른 문제의 증상이었다 밝혀졌습니다. 라이브러리는 두 개의 다른 스레드에서 일부 wininet apis를 사용했으며, 그 중 하나는 dllmain에 있고 loaderlock 내부에있었습니다. 이 두 스레드는 교착 상태가되어 GetModuleFileName이라는 스레드를 잠갔습니다.

내가 아는 한 그 정도면 충분하지만 일단 라이브러리 공급 업체로부터 좀 더 자세한 정보를 얻으면 업데이트 할 예정입니다.

0

그냥 몇 가지 임의 아이디어 :

  • (C 단지) 코드는,이 시스템은로드 록을 보유하는 동안 DLL에 정적으로 할당 된 객체의 수 생성자도 수행입니다 ++ C가 있다면. 그런 객체의 생성자/소멸자에서 자물쇠를 사용하지 않습니까?

  • 아마도 자물쇠에도 불구하고 버그가있을 수 있으며 자물쇠를 사용하면 실제로 예를 들어 경쟁자를 '숨기기'할 수 있습니다. 일부 스레드에서 동작 타이밍을 변경합니다. DllMain() 및 스레드가 까다로울 수 있습니다. 잘 http://blogs.msdn.com/b/oldnewthing/archive/2007/09/04/4731478.aspx

+0

아이디어를 주셔서 감사합니다. 잠시 생각해 볼 시간이있었습니다. 잠금 장치를 DLL의 요소로 사용하려면 응용 프로그램이 특정 인스턴스를 찾기 쉬운 DLL로 전달해야합니다. 그런 건 보지 못했어요. 잠금 장치가 문제를 재현 할 수있을 때 잠금을 제거하면 교착 상태가 사라지기 때문에 잠금 장치가 관련되어있는 것처럼 보입니다. 그러나 타이밍을 바꾸는 것을 결코 배제 할 수는 없다. 또한 문제가 발생할 때 com 객체를 사용하는 스레드를 포함하도록 문제 설명을 편집했습니다. –

+0

링크가 잘못되었으므로 다음 링크를 사용하십시오. http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx –

+0

그 중 하나는 이미 질문에 있지만 명백히 도움이되지 않았습니다. 그러나'DllMain()'을 사용하여 교착 상태를 일으키는 방법은 여러 가지가 있으며 내 링크도 제공합니다. – mity

관련 문제