WaitForSingleObject получает свой семафор в XP, но не в Vista - PullRequest
1 голос
/ 06 февраля 2010

Следующий код прекрасно работает на моем компьютере с XP SP2, но при запуске на моем компьютере с Vista, вызов WaitForSingleObject бесконечно ждет:

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 - это то, что никогда не завершается.

спасибо!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2010

решаемая. Это была полностью ошибка пользователя. Спасибо @Dewfy, @Naveen и @avakar за вдумчивые ответы.

Я был уверен, что вызывается пользовательская функция, потому что я отображал ее результат в моем макете Filemaker. Я не смог понять, что эти возвращаемые значения кэшируются по умолчанию. Функция никогда не вызывалась. Ваши предложения были действительно полезны, потому что только когда я полностью понял, что я делаю с моими потоками и семафорами, я смог отступить назад и сказать «подожди, что-то здесь не так».

Я все еще сталкиваюсь с загадкой, почему, когда я удалил код семафора, я смог получить доступ к ресурсу, который должна была предоставить пользовательская функция, даже если эта функция не выполнялась. Но это отдельная проблема.

чувствует себя хорошо

0 голосов
/ 06 февраля 2010

Я не могу проверить это сейчас, но слышал об этом, поэтому попробуйте: Измените первый аргумент CreateSemaphore с NULL на пустой экземпляр SECURITY_ATTRIBUTES

SECURITY_ATTRIBUTES dumy;
dumy.nLength = sizeof(dumy);
dumy.lpSecurityDescriptor = 0;
dumy.bInheritHandle = TRUE;
CreateSemaphore(&dumy, 0, 1, "COM_PHILOERTEL_FINA");

Кстати, именованный семафор с lMaximumCount = 1 полностью эквивалентен названному мьютексу. Так что рассмотрите возможность использования мьютекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...