Ожидать мьютекса с ненулевым таймаутом можно только на PASSIVE_LEVEL. Если Вам нужно синхронизировать доступ к списку на DISPACTH_LEVEL — нужно использовать спинлок ( KSPIN_LOCK )
SO>>LARGE_INTEGER liWaitMutex = {0xFFFFFFFF, 0xFFFFFFFF}; SO>>... SO>>ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); SO>>KeWaitForSingleObject(pProcInfoMutex, Executive, KernelMode, FALSE, &liWaitMutex);
TC>Ожидать мьютекса с ненулевым таймаутом можно только на PASSIVE_LEVEL. Если Вам нужно синхронизировать доступ к списку на DISPACTH_LEVEL — нужно использовать спинлок ( KSPIN_LOCK )
SO>>LARGE_INTEGER liWaitMutex = {0xFFFFFFFF, 0xFFFFFFFF}; SO>>... SO>>ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); SO>>KeWaitForSingleObject(pProcInfoMutex, Executive, KernelMode, FALSE, &liWaitMutex);
TC>Ожидать мьютекса с ненулевым таймаутом можно только на PASSIVE_LEVEL. Если Вам нужно синхронизировать доступ к списку на DISPACTH_LEVEL — нужно использовать спинлок ( KSPIN_LOCK )
Вы уверены? . Ожидание мьютекса без таймаута не гарантирует его захват. Он будет захвачен лишь в том случае, если окажется свободным. Если же Вам придет в голову на DISPATH_LEVEL опрашивать мьютекс в цикле, то есть вероятность угодить в жесткий дедлок. По сему, еще раз повторяю — надежную синхронизацию на DISPATCH_LEVEL можно сделать только с помощью спин-лока.
Здравствуйте, TarasCo, Вы писали:
SO>>Разобрался вроде.
TC>Вы уверены? . Ожидание мьютекса без таймаута не гарантирует его захват. Он будет захвачен лишь в том случае, если окажется свободным. Если же Вам придет в голову на DISPATH_LEVEL опрашивать мьютекс в цикле, то есть вероятность угодить в жесткий дедлок. По сему, еще раз повторяю — надежную синхронизацию на DISPATCH_LEVEL можно сделать только с помощью спин-лока.
Так... Тогда код приведу, как у меня...
Это там где вставляю всписок:
SO>NULL в KeWaitForSingleObject — это насколько я понял — захватить, пока не освобожу. Это прально?
NULL — это значит ждать освобождения мьютекса ( с последующим захватом ) с бесконечным таймаутом. Код формально правильный, но может выполняться только на PASSIVE_LEVEL.
SO>>NULL в KeWaitForSingleObject — это насколько я понял — захватить, пока не освобожу. Это прально?
TC>NULL — это значит ждать освобождения мьютекса ( с последующим захватом ) с бесконечным таймаутом. Код формально правильный, но может выполняться только на PASSIVE_LEVEL.
Я переделал, как Вы советовали со спинлоком. Опыту у Вас больше, поэтому прислушаюсь. Все работает.
Спасибо еще раз за разъяснения!