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

368
30 декабря 2016, 11:33

Приветствую. Есть некая функция, которая получает хеш-сумму файла (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;
}
Answer 1

Грубо говоря, локальная переменная

string buffer;  

передается в поток

thread t(calclulateHash, ref(buffer));

каковой поток отсоединяется и выполняется и, как я понимаю, потом пытается писать в buffer

t.detach();

которого уже нет, потому что функция, в которой он объявлен, давно закончилась...

Зачем вам вообще считать нечто, что вы никак не используете?

Answer 2

Таким образом как вы делаете, делать нельзя. В DllMain нельзя запускать потоки (или проводить синхронизацию).

Вынесите запуск потока в отдельную функцию и вызывайте её не из DllMain, а из другого места.

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

DllMain — это специальная; очень ограниченная функция, принципы, распространяемые на обычные функции, тут не работают.

Ну и интересна сигнатура функции calculateHash, конечно.

READ ALSO
Как организовать структуру базы данных?

Как организовать структуру базы данных?

Есть БД usersВ одной из таблиц есть поля login, password, id

454
Primary key по двум столбцам MySQL

Primary key по двум столбцам MySQL

ЗдравствуйтеПредположим, есть таблица со столбцами user_id и user_group, остальные столбцы не важны

361
Помогите сделать запрос

Помогите сделать запрос

Фирма занимается приемом вторсырья и имеет несколько пунктов приемаКаждый пункт получает деньги для их выдачи сдатчикам в обмен на сырье

379