우리는 다중 스레드 응용 프로그램을 가지고 있습니다. 작업자 스레드 중 하나가 로깅 목적을 위해 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과의 상호 작용 가능성?
어쨌든 우리는이 교착 상태가 발생하는 정확한 방법을 식별하지 못했습니다. 그래서 몇 가지 아이디어가 필요하거나, 다른 경우의면에서 로더 락에 대한 좀 더 자세한 정보를 얻으려는 것이고, 차단할 가능성이있는 로더 락 내에서 코드가 실행되는 다른 시나리오가있는 경우입니다.
감사합니다.
아이디어를 주셔서 감사합니다. 잠시 생각해 볼 시간이있었습니다. 잠금 장치를 DLL의 요소로 사용하려면 응용 프로그램이 특정 인스턴스를 찾기 쉬운 DLL로 전달해야합니다. 그런 건 보지 못했어요. 잠금 장치가 문제를 재현 할 수있을 때 잠금을 제거하면 교착 상태가 사라지기 때문에 잠금 장치가 관련되어있는 것처럼 보입니다. 그러나 타이밍을 바꾸는 것을 결코 배제 할 수는 없다. 또한 문제가 발생할 때 com 객체를 사용하는 스레드를 포함하도록 문제 설명을 편집했습니다. –
링크가 잘못되었으므로 다음 링크를 사용하십시오. http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx –
그 중 하나는 이미 질문에 있지만 명백히 도움이되지 않았습니다. 그러나'DllMain()'을 사용하여 교착 상태를 일으키는 방법은 여러 가지가 있으며 내 링크도 제공합니다. – mity