에서 다음 코드는 내 XP의 SP2 시스템에서 완벽하게 잘 실행되지만 내 비스타 시스템에서 실행 때의 WaitForSingleObject에 대한 호출이 무기한 대기 : 여기의 WaitForSingleObject는 XP에서 자신의 세마포어를 얻을 수 있지만 비스타
HANDLE ghSemaphore;
ghSemaphore = CreateSemaphore(NULL, 0, 1, "COM_PHILOERTEL_FINA");
if (ghSemaphore == NULL) {
MessageBoxA(NULL,"Error creating semaphore","ERROR",0);
return FALSE;
}
MessageBoxA(NULL,"Semaphore created. Waiting for it to be triggered","ERROR",0);
WaitForSingleObject(ghSemaphore, INFINITE);
// got the semaphore, ready to rock
MessageBoxA(NULL,"Got the semaphore, ready to rock!","Notice",0);
스레드의 그 세마포어를 해제합니다.
ghSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "COM_PHILOERTEL_FINA");
if (ghSemaphore == NULL) {
MessageBoxA(NULL,"Failed to open semaphore","ERROR",0);
return FALSE;
}
if (0 == ReleaseSemaphore(ghSemaphore, 1, NULL)) {
MessageBoxA(NULL,"Plugin was unable to release the semaphore","ERROR",0);
return FALSE;
}
명명 된 세마포는 최근에 추가되지 않은 것이 었습니다. 그 전에 스레드는 익명의 세마포어로 ghSemaphore를 공유하고있었습니다. 명백한 차이는 없습니다. 누구든지 왜이 이진 (VC6, Express Edition에서 XP 컴퓨터에서 컴파일 된) 비스타에서 작동하지 않을 생각을 가지고 있습니까? 위에서 말했듯이, WaitForSingleObject 호출은 결코 끝나지 않는 것입니다.
THanks!
MSDN에서는 ReleaseSemaphore()에 SEMAPHORE_MODIFY_STATE 보안 속성이 필요하다고 말합니다. CreateSemaphore()의 보안 속성에 대한 매개 변수로 NULL을 사용하고 있습니다. 이 보안 속성 집합으로 한 번 시도해 볼 수 있습니까? – Naveen
@Naveen, 일단 OpenSemaphore가 성공하면 (물론 OP가 아마도 다른 점을 알게 될 것입니다) 핸들 *은 SEMAPHORE_MODIFY_STATE 액세스 권한을가집니다. – avakar
@philo, 코드는 Vista에서 나에게 잘 작동합니다. 스 니펫을 별도의 프로세스에 넣었을 때도 마찬가지입니다. 귀하의 프로세스에 특별한 것이 있습니까? 아니면 평범한 응용입니까? – avakar