WaitForSingleObject и циклы while в C / ++ - PullRequest
       19

WaitForSingleObject и циклы while в C / ++

2 голосов
/ 14 октября 2011

Вот фрагмент: prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc"); // I have to use TRUE otherwise WaitForSingleObject fails.. by design it wants to take ownership and w//o TRUE there is no owner anyway right? <<-- **check this please if its true**
...

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {
// do smthing
ReleaseMutex(hM);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc"); // In order to continue while loop but it doesnt rewind,
}

Проблема> Это не сделает полубесконечный цикл ... он входит один раз и вот так.

Цель?Чтобы отслеживать активность какого-либо процесса (если он аварийно завершается, я перезапускаю его), бесконечные циклы сильно бьют по моему процессору, и я не могу использовать Sleep, мне нужно перезапустить его asasp (хорошо, если какое-то умное решение возможно с помощью while (1) или for (;;) пожалуйста, напишите)

ОБНОВЛЕНИЕ

должно быть в то время как (WaitForSingleObject (hM, INFINITE) == WAIT_ABANDONED) {...}, я неправильно скопировал:).

Он работает один раз, а потом не будет ждать, есть ли способ сбросить дескриптор?


prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc");

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {    
ReleaseMutex(hM);
Sleep(1000);
CloseHandle(hM)
// do smthing like CreateProcess()
Sleep(1000);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
}

Таким образом, это работает, если кто-то хочет добавить комментарий к этому сообщению.

Ответы [ 3 ]

4 голосов
/ 14 октября 2011

Чтобы обнаружить сбой процесса, вы не должны беспокоиться о мьютексе.Просто подождите на ручке процесса.Как только процесс завершается, дескриптор будет сигнализирован, и WaitForSingleObject вернется.

Если вы создаете процесс, вы можете получить дескриптор процесса из аргумента PROCESS_INFORMATION.Затем просто используйте:

PROCESS_INFORMATION pi;

do {
// create the process, passing pi as the last argument to CreateProcess
} while (WaitForSingleObject(pi.hProcess, INFINITE));

Обратите внимание, что дескриптор должен быть закрыт, вы можете выяснить, когда.


Обновление - учитывая, что это не вариант, вот проблема вваш код:

Скажите, что prog1 успешно запущен, и теперь prog2 ожидает сигнала мьютекса.Затем происходит сбой prog1, и prog2 становится владельцем мьютекса.Учитывая, что цель prog2 - перезапустить prog1, я предполагаю, что это то, что происходит в // do smthing.Итак, теперь запускается prog1 и вызывает CreateMutexA.Но prog2 все еще может удерживать мьютекс, и поэтому prog1 только получает указатель на существующий мьютекс, но фактически не владеет им.Теперь prog2 вызывает ReleaseMutex и продолжает ждать сигнального мьютекса, который не принадлежит prog1.Ожидание немедленно возвращается с WAIT_OBJECT_0, и вы выходите из while.

Итак, я думаю, что использование prog1 CreateMutexA здесь неправильно.Вместо этого вы должны создать не принадлежащий мьютексу и ждать его.Таким образом, вы обеспечите владение мьютексом программой prog1.

1 голос
/ 14 октября 2011

Я согласен с точкой зрения Эрана, что вам следует просто подождать непосредственно с дескриптором процесса.

Относительно того, почему ваш код не входит в цикл while, когда вы думаете, что это должно быть достаточно легко решить. Цикл while завершается, когда WaitForSingleObject возвращает 0. То есть, когда он возвращает WAIT_OBJECT_0 или, другими словами, когда он приобрел владение мьютексом. Это происходит, когда предыдущий владелец выпускает его.

0 голосов
/ 14 октября 2011

Вам не нужно заново открывать мьютекс. WaitForSingleObject вступает во владение, а ReleaseMutex освобождает владение, но мьютекс остается открытым, пока вы не вызовете CloseHandle.

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