Приветствую. Есть некая функция, которая получает хеш-сумму файла (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;
}
Грубо говоря, локальная переменная
string buffer;
передается в поток
thread t(calclulateHash, ref(buffer));
каковой поток отсоединяется и выполняется и, как я понимаю, потом пытается писать в buffer
t.detach();
которого уже нет, потому что функция, в которой он объявлен, давно закончилась...
Зачем вам вообще считать нечто, что вы никак не используете?
Таким образом как вы делаете, делать нельзя. В DllMain
нельзя запускать потоки (или проводить синхронизацию).
Вынесите запуск потока в отдельную функцию и вызывайте её не из DllMain
, а из другого места.
Одной из возможных причин проблемы является синхронизация всех вызовов DllMain
: каждый её вызов ждёт окончания других. Если вы запускаете поток, это приводит к попытке рекурсивного вызова с флагом DLL_THREAD_ATTACH
(не PROCESS
), что немедленно приводит к проблемам.
DllMain
— это специальная; очень ограниченная функция, принципы, распространяемые на обычные функции, тут не работают.
Ну и интересна сигнатура функции calculateHash
, конечно.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть БД usersВ одной из таблиц есть поля login, password, id
ЗдравствуйтеПредположим, есть таблица со столбцами user_id и user_group, остальные столбцы не важны
Фирма занимается приемом вторсырья и имеет несколько пунктов приемаКаждый пункт получает деньги для их выдачи сдатчикам в обмен на сырье