Здравствуйте, Privaloff, Вы писали:
P>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.
P>Привожу исходный текст своего бедствия:
P>
P>Предполагалось, что результатом работы будет вот что:
P>------------------- P>Thread 1. Wait... P>3s P>Exit... P>5s P>-------------------
P>А не тут-то было:
P>------------------- P>Exit... P>Thread 1. Wait... P>3s P>5s P>-------------------
P>Т.е. _tmain плюет на WaitForSingleObject(mut, INFINITE) и, не дожидаясь ReleaseMutex(mut), скачет дальше. Почему?
Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...
В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.
P>Стоит поменять в WaitForSingleObject mut на tr1 — работает, как полагается.
Ну так ясен перец P>
Re[2]: WaitForSingleObject не дожидается ReleaseMutex
P>Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...
Пробовал. Признаюсь, методом тыка "тыкал" WaitForSingleObject'ом и в начало thread_1 Результаты по-прежнему нехорошие.
P>В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.
Здравствуйте, Privaloff, Вы писали:
P>>Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...
P>Пробовал. Признаюсь, методом тыка "тыкал" WaitForSingleObject'ом и в начало thread_1 Результаты по-прежнему нехорошие.
P>>В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.
P>Поставил, перенес:
P>---------------------- P>Exit... P>Thread 1. Wait... P>3s P>5s P>----------------------
Похоже как раз и имеют место "квантовые эффекты". Суть скорее всего в том, что thread_1 не сразу получает управление после CreateThread(). И получается, что _tmain "добирается" до WaitForSingleObject раньше, чем thread_1, а в этот момент мьютекс оказывается свободен, и WaitForSingleObject "проваливается". Для эксперимента в _tmain поставь Sleep(100) перед WaitForSingleObject, должно заработать. А вообще такие вещи "канонически" делаются через Event: _tmain создает Event в nonsignal состоянии, создает нить и входит в WaitForSingleObject, а thread_1 устанавливает Event в signal с помощью SetEvent. Вроде бы тал . А с мьютексом кто первый захватил — тот и прав . Еще для чистоты в конец _tmain желательно поставить ReleaseMutex. Ну это уже так, придирки...
Re: WaitForSingleObject не дожидается ReleaseMutex
Здравствуйте, Privaloff, Вы писали:
P>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.
P>Привожу исходный текст своего бедствия:
P>
Здравствуйте, pavel_turbin,
P>>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.
P>>Привожу исходный текст своего бедствия:
P>>
P>>Предполагалось, что результатом работы будет вот что:
_>проблема в "CloseHandle(mut);" Она закрывает handle, в то время пока thread ждущий в WaitForSingleObject, еще не scheduled.
_>перенесите CloseHandle(mut); в конец tmain и все должно заработать.
--
Наверное, стоит также использовать только одну (глобальную) переменную mut.
А еще лучше — ждать окончания thread непосредсьвенно в WaitForSingleObject.
C уважением,
Геннадий Майко.
Re: WaitForSingleObject не дожидается ReleaseMutex