Привет. Помогите кто знает. Есть 2 процесса - дочерний и родительский. Дочерний унаследовал от родителя мутекс, который он и ждет. Если он не дождался в течении какого-то времени, то он должен умереть. То есть такой код: Код (Text): ... dwResult = WaitForSingleObject(hMutex, TimeOut); if(dwResult == WAIT_TIMEOUT) { ExitProcess(0); } if(dwResult == WAIT_OBJECT_0) { //общаемся с предком .... Теперь, предку нужно узнать, ждет ли потомок мутекс... и живой ли он вообще. Ничего лучше не придумал, как освободить мутекс, и потом заново его проверить. И вот тут меня мучает вопрос: как быстро ждущий процесс захватит освободившийся мутекс? Вот код предка Код (Text): ... hMutex = CreateMutex(&sa, true, NULL); //наследуемый, заблокированный CreateProcess(... ... //через некоторое время мы захотели пообщаться ReleaseMutex(hMutex); //может сюда вставить Sleep(0)? if(WaitForSingleObject(hMutex, 0) == WAIT_TIMEOUT) { //Дочерний процесс захватил мутекс } else { //Пообщаться не удастся } Подскажите, нужно ли вставлять Sleep(0) после ReleaseMutex, или вообще такое решение неправильно?
Если я не ошибаюсь: Код (Text): dwResult = WaitForSingleObject(hMutex, TimeOut); if(dwResult == WAIT_TIMEOUT) { ExitProcess(0); } if(dwResult == WAIT_OBJECT_0) { ReleaseMutex(hMutex); //общаемся с предком
Partner Дочерний процесс может быть живой, но может быть в практическом смысле бесполезный. Допустим: Код (Text): //Дочерний процесс dwResult = WaitForSingleObject(hMutex, TimeOut); //Произошел таймаут.. dwResult = WAIT_TIMEOUT //<-- В этом месте происходит переключение потоков на родительский --> if(dwResult == WAIT_TIMEOUT) { ExitProcess(0); ... // Родительский процесс if(WaitForSingleObject(HandleOfProcess, 0) == WAIT_TIMEOUT) // Процесс живой... но никакая информация от нас его уже не интересует :-( Я хотел узнать ответ вот на какой вопрос: Будет ли объект (в данном случае мутекс) захвачен ожидающим его потоком сразу при выходе из ReleaseMutex? Или мне нужно ждать следующего тика (вызовом Sleep(0))?Что-то в документации об этом слабо упоминается.. Полистал Соломона и Руссиновича... Там говорится что вроде бы сразу. Причем ждущий поток может забрать у текущего окончание его тика, если у него приоритет выше. Но как-то это расплывчато...
Будет захвачен сразу. Но поток, захвативший мютекс, получит управление когда придет его время. Если ты вызовешь Sleep(0) - возможно ты ускоришь этот момент.