Ребята почему у меня неполучается создать в длл поток? Код (Text): BOOL APIENTRY DllMain (HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { Func1( NULL );//Здесь я выполняю какието действия с переменными //В потоке хочу запустить обработчик HANDLE hThr=CreateThread(NULL, 0, &Func2, NULL, 0, NULL); Func3( NULL );//и здесь хочу запустить цикл обработчика } break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; }
В DllMain() нельзя создавать никаких циклов, тред создал и завершайся. Созданный тред не начнет выполняться, пока ты в DllMain(), потому что перед этим вызываются DllMain() остальных модулей для уведомления о новом потоке, а это происходит в крит. секции по очереди.
тоесть можно при инициализации длл в DllMain создать два потока через CreateThread и потом когда оно оттуда выйдет то эти потоки создадутся нормально? я почемуто думал что вся работа в длл происходит в DllMain все правильно я понял?
@[ixTor], Создадутся они сразу, но выполняться начнут только после того, как загрузчик вызовет DllMain() всех (не отказавшихся от уведомлений о создании треда) dll в процессе, а делает он это по очереди, т.е. когда ты вернешь управление из своей DllMain(). Смотря какая это работа. Если просто выделение памяти, чтение файлов/реестра и т.п., то можно прям в DllMain() делать, но если есть функции ожидания, длинные циклы, создание сокетов, то надо выносить все в отдельный поток, иначе может быть дедлок.
@[ixTor], Загрузчик это синхронный ресурс, пока он занят одним тредом, второй его выполнять не может. Если родитель начнёт синхронизацию, не освободив загрузчик, это приведёт к деадлоку(глобальной блокировке), вcе потоки зависнут. Даже те, которые отношения не имеют к тем двум потокам.
https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx Там даже диаграмка есть забавная: Наверно нужно изучить обьект, прежде чем его использовать Если тс идёт на форум с таким вопросом, то это весьма странно.