Что такое блокиратор загрузчика?

Я занимался потоками и имел потенциальную проблему взаимоблокировки. Кто-то сказал мне о блокировке погрузчика.

Я не мог найти много информации в Интернете. Может кто-то, пожалуйста, помогите мне и объясните: "Что такое Загрузчик загрузчика"?

Ответ 1

Например, просмотрите этот вопрос:

Ошибка блокировки загрузчика

Общая идея блокировки загрузчика: система запускает код в 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);
   ...
  }
  ...
}

Прочитайте всю статью для полного понимания.