Следующий код работает отлично на моем XP SP2 машине, но вызов WaitForSingleObject ждет неопределенное время, когда работает на моей машине перспективы:WaitForSingleObject получает свой семафор в XP, но не в Vista,
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 с его анонимным семафором. Нет очевидной разницы. Кто-нибудь знает, почему этот бинарный файл (скомпилированный на машине XP в VC6, Express Edition fwiw) не будет работать в Vista? Как я сказал выше, вызов WaitForSingleObject - это то, что никогда не заканчивается.
Чин!
MSDN говорит, что ReleaseSemaphore() требует SEMAPHORE_MODIFY_STATE атрибут безопасности. Вы используете NULL в качестве параметра атрибута безопасности в CreateSemaphore(). Можете ли вы попробовать один раз с этим набором атрибутов безопасности? – Naveen
@Naveen, как только «OpenSemaphore» преуспеет (и, по-видимому, делает это, поскольку OP, вероятно, замечает обратное), у дескриптора * есть * право доступа SEMAPHORE_MODIFY_STATE. – avakar
@philo, код отлично работает для меня в Vista, даже когда я помещаю фрагменты в отдельные процессы. Есть ли что-то особенное в вашем процессе или это нормальное неэлектированное приложение? – avakar