Привет, коллеги! 👋 Вы профессиональные C++ разработчики, пишете идеальный код, но внезапно ваше приложение зависает при загрузке DLL. Виновник - deadlock в DllMain. Почему это происходит и как это исправить? Давайте разберёмся! При загрузке или выгрузке DLL система входит в критическую секцию загрузчика (Loader Lock). Ваша функция DllMain выполняется под этой блокировкой. Если вы попытаетесь сделать что-то, что требует другой блокировки (например, создание потока), - deadlock неизбежен. 💥 Типичные причины deadlock: #include <Windows.h> #include <thread> BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { switch (reason) { case DLL_PROCESS_ATTACH: // ⚠️ Опасность! Создание потока под Loader Lock. std::thread killer_thread([]() { // Поток пытается загрузить другую DLL -> deadlock! LoadLibraryA("Another.dll"); }); killer_thread.join(); // Вечное ожидание... break; } return TRUE; } Что
DLL в многопоточных средах: Deadlock в DllMain и как избежать кошмара
18 июня18 июн
1
2 мин