Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

Как запустить функцию в потоке (DLLMain)?

#cpp #многопоточность #dll #cpp11


Приветствую. Есть некая функция, которая получает хеш-сумму файла (exe) и записывает
ее в файл. Она запущена в потоке, но приложение откуда она запускается - крашит. Хотелось
бы узнать как правильно запустить функцию в потоке, чтобы приложение не крашилось.

void initialize()
{
    string buffer;
    thread t(calclulateHash, ref(buffer));
    t.detach();
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            initialize();
            break;
        }
    }
    return true;
}

    


Ответы

Ответ 1



Таким образом как вы делаете, делать нельзя. В DllMain нельзя запускать потоки (или проводить синхронизацию). Вынесите запуск потока в отдельную функцию и вызывайте её не из DllMain, а из другого места. Одной из возможных причин проблемы является синхронизация всех вызовов DllMain: каждый её вызов ждёт окончания других. Если вы запускаете поток, это приводит к попытке рекурсивного вызова с флагом DLL_THREAD_ATTACH (не PROCESS), что немедленно приводит к проблемам. DllMain — это специальная; очень ограниченная функция, принципы, распространяемые на обычные функции, тут не работают. Ну и интересна сигнатура функции calculateHash, конечно.

Ответ 2



Грубо говоря, локальная переменная string buffer; передается в поток по ссылке (благодаря std::ref): thread t(calclulateHash, ref(buffer)); каковой поток отсоединяется и выполняется и, как я понимаю, потом пытается писать в buffer t.detach(); которого уже нет, потому что функция, в которой он объявлен, давно закончилась... Зачем вам вообще считать нечто, что вы никак не используете?

Комментариев нет:

Отправить комментарий