Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Бред в документации Майкрософта |
Автор: nerdy_weirdie 11.10.2010, 06:45 | ||
Как можно отдать потоку команду на завершение из DllMain по сообщению DLL_THREAD_DETACH, если эту самую DllMain с этим сообщением вызывает сам поток и уже после выхода из основной процедуры? Что они имели ввиду? ![]() |
Автор: GremlinProg 11.10.2010, 10:35 |
тут просто сказано, что нет смысла пытаться что-либо синхронизировать в dllmain'е, т.к. сам вызов dllmain эксклюзивный, т.е. он блокирует любые одновременные попытки войти в dllmain, поэтому любой барьер тут приведет к дедлоку |
Автор: nerdy_weirdie 11.10.2010, 10:44 |
Это совершенно понятно. Меня интересует рецепт решения, который написан после двоеточия. Приведен фрагмент из статьи описывающей возможные проблемы при создании длл и пути их решения. |
Автор: GremlinProg 11.10.2010, 11:04 | ||
после двоеточия описан рецепт выхода из ситуации, описанной перед двоеточием, т.е. по завершении длл А (из какого-то потока), она пытается подождать завершения определенного потока T (очевидно вот таким вот макаром: WaitForSingleObject( T, INFINITE ) ), что естественно приводит к дедлоку вот они и пишут, что мол если нужно синхронизировать завершение потока T в dllmain, то какой-то конец этой синхронизации надо оставить за пределами dllmain: при выходе длл А, надо поднять событие для завершения потока T, поток T, среагировав на это событие, завершит свою основную работу (например какой-то цикл), и самым своим последним действием пошлет сигнал обратно в длл А, освободив ее от бесконечного ожидания, т.е. разрешив дедлок Добавлено @ 11:09 т.е. что-то вроде такого:
|