Я занимался потоками и имел потенциальную проблему взаимоблокировки. Кто-то сказал мне о блокировке погрузчика.
Я не мог найти много информации в Интернете. Может кто-то, пожалуйста, помогите мне и объясните: "Что такое Загрузчик загрузчика"?
Я занимался потоками и имел потенциальную проблему взаимоблокировки. Кто-то сказал мне о блокировке погрузчика.
Я не мог найти много информации в Интернете. Может кто-то, пожалуйста, помогите мне и объясните: "Что такое Загрузчик загрузчика"?
Например, просмотрите этот вопрос:
Общая идея блокировки загрузчика: система запускает код в
DllMain
внутри блокировки (как блокировка синхронизации). Таким образом, запуск нетривиального кода внутриDllMain
означает "запрос на блокировку"
Ответ, о котором я говорил, основан на этой статье:
Еще одна причина не делать ничего страшного в вашем DllMain
: непреднамеренный тупик
Функция DllMain запускается внутри блокировки загрузчика, что является одним из немногих случаев, когда ОС позволяет запускать код, когда выполняется одна из его внутренних блокировок. Это означает, что вы должны быть осторожны, чтобы не нарушать иерархию блокировки в
DllMain
; в противном случае вы запрашиваете тупик.Блокировка загрузчика выполняется любой функцией, которая должна получить доступ к списку DLL, загруженных в процесс. Сюда входят такие функции, как
GetModuleHandle
иGetModuleFileName
. Если вашDllMain
входит в критический раздел или ждет объект синхронизации, а этот критический раздел или объект синхронизации принадлежит некоторому коду, который в свою очередь ждет блокировки загрузчика, вы просто создали тупик:
// global variable
CRITICAL_SECTION g_csGlobal;
// some code somewhere
EnterCriticalSection(&g_csGlobal);
... GetModuleFileName(MyInstance, ..);
LeaveCriticalSection(&g_csGlobal);
BOOL WINAPI
DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved)
{
switch (fdwReason) {
...
case DLL_THREAD_DETACH:
EnterCriticalSection(&g_csGlobal);
...
}
...
}
Прочитайте всю статью для полного понимания.