우리는 하나의 스레드가 SuspendThread/GetThreadContext/ResumeThread를 수행하여 상태 [PC 등]를 검사하도록 다른 스레드를 중지시킬 수있는 Windows32 응용 프로그램을 보유하고 있습니다.Windows SuspendThread가 아닙니까? (GetThreadContext 실패)
if (SuspendThread((HANDLE)hComputeThread[threadId])<0) // freeze thread
ThreadOperationFault("SuspendThread","InterruptGranule");
CONTEXT Context, *pContext;
Context.ContextFlags = (CONTEXT_INTEGER | CONTEXT_CONTROL);
if (!GetThreadContext((HANDLE)hComputeThread[threadId],&Context))
ThreadOperationFault("GetThreadContext","InterruptGranule");
는 매우 드물게, 멀티 코어 시스템에서 GetThreadContext 오류 코드 5 (윈도우 시스템 오류 코드 "액세스가 거부") 반환하지 않습니다.
SuspendThread 설명서는 오류가 반환되지 않으면 대상 스레드가 일시 중단되었음을 명확하게 나타냅니다. SuspendThread 및 ResumeThread의 반환 상태를 확인하고 있습니다. 그들은 이제까지 불평하지 않고 있습니다.
스레드를 일시 중단 할 수 있지만 해당 컨텍스트에 액세스 할 수없는 경우 어떻게 수 있습니까? http://www.dcl.hpi.uni-potsdam.de/research/WRK/2009/01/what-does-suspendthread-really-do/
이 블로그는, SuspendThread로, 그것은 반환 할 때, 이 다른 스레드의 정지 시작 수 있음을 시사하지만 스레드는 아직 중단되지 않았습니다. 이 경우 GetThreadContext가 어떻게 문제가되는지 알 수는 있지만 SuspendThread를 정의하는 것은 어리석은 방법입니다. (대상 스레드가 실제로 일시 중단 된 시점을 SuspendThread가 어떻게 알 수 있습니까?)
EDIT : 거짓말. 나는 이것이 Windows 용이라고 말했다.
이상한 진실은 Windows XP 64에서이 동작을 볼 수 없다는 것입니다. (적어도 지난 주에는 없었으며 그 전에는 어떤 일이 발생했는지 모릅니다.) 그러나 우리는 테스트를 거쳤습니다. Ubuntu 10.x의 Wine에서이 Windows 응용 프로그램. Wine source for the guts of GetThreadContext에는 어떤 이유로 든 스레드 상태를 가져 오지 못하면줄에 819의 액세스 거부 응답이 포함되어 있습니다. 추측 하건데, Wine GetThreadStatus는 스레드가 반복적으로 액세스 할 수 없다고 생각합니다. SuspendThead가 나를 넘어선 뒤에는 그것이 사실 일 것입니다.하지만 코드가 있습니다. 생각?
EDIT2 : 다시 거짓말했습니다.. 나는 우리가 와인에서만 그 행동을 보았다고 말했다. 아니 ... 우리는 이제 동일한 오류 (다시는 드물게)를 생성하는 것으로 보이는 Vista Ultimate 시스템을 발견했습니다. 따라서 와인과 Windows는 모호한 경우에 동의합니다. 또한 Sysinternals Process 모니터 프로그램을 단순히 활성화하면 상황이 심각 해지고 Windows XP 64에 문제가 발생합니다. 나는 Heisenbug를 의심한다. (Process Monitor 은 Wine-tasting (:-) 기계 또는 개발 용으로 사용하는 XP 64 시스템에도 존재하지 않습니다.
지구상에 무엇이 있습니까?
EDIT3 2010 년 9 월 15 일. SuspendThread, ResumeThread 및 GetContext에 대해 코드를 방해하지 않고 오류 반환 상태를 신중하게 확인했습니다. 나는 그것을 한 이후로 어떤 힌트를 Windows 시스템에서 보았습니다. 와인 실험으로 돌아 가지 않았습니다.
2010 년 11 월 : Strange. VisualStudio 2005에서 컴파일하면 Windows Vista 및 7에서는 실패하지만 이전 OS에서는 실패합니다. VisualStudio 2010에서 컴파일하면 아무데도 실패하지 않습니다. VisualStudio2005에서 손가락을 가리킬 수도 있지만 location-sensitivve 문제는 의심 스럽지만 VS 2005 및 VS 2010의 다른 최적화 도구는 코드를 약간 다른 위치에 배치합니다.
2012 년 11 월 : 사가가 계속됩니다.우리는 꽤 낮은 속도 (수천 회 실행마다 한 번)로 다수의 XP 및 Windows 7 시스템에서이 실패를 봅니다. Suspend 활동은 대부분 순수한 계산 코드를 실행하지만 때로는 Windows로 호출하는 스레드에 적용됩니다. 쓰레드의 PC가 우리의 계산 코드에있을 때이 문제를 본 것을 기억하지 못합니다. 물론 GetContext가 나에게주지 않기 때문에 스레드가 멈 추면 스레드의 PC를 볼 수 없기 때문에 시스템 호출을 실행할 때만 문제가 발생한다는 것을 직접 확인할 수는 없습니다. 그러나 우리의 모든 시스템 호출은 한 지점을 통해 전달되며, 지금까지 그 증거는 우리가 멈출 때 그 지점이 실행된다는 것입니다. 따라서 간접적 인 증거에 따르면 시스템 호출이 해당 스레드에 의해 실행될 경우에만 스레드의 GetContext가 실패합니다. 나는 아직이 가설을 시험하기위한 비판적인 실험을 할 에너지가 없다.
2010 년 11 월 "VS 2005 VS VS 2010으로 컴파일 할 때 다른 결과 가져 오기"* 이후 버전의 OS에서 정렬 제약 조건 (?)이 추가 될 수도 있습니다. http://stackoverflow.com/q/4696543/120163 –