dll на c++ вылетает при detach

Страницы: 1
RSS
dll на c++ вылетает при detach
 
Пишу dll для экспорта котировок в mysql.
В процессе выполнения, ввиду большого потока данных, функцию осуществляющую insert в mysql открепляю через detach(), чтобы быстрее вернуть управление в lua и не тормозить программу.
Однако, каждый раз головная программа немного работает и вылетает. Пока не упала, судя по логам, успевает несколько раз прокрутить детачнутую функциюю Иногда и 1 раз не успевает полностью. Такое ощущение, будто со временем что-то накапливается или до какого-то момента доходит и вылетает. Но каждый раз разный момент - иногда при первом запуске детачнутой функции крашится, а иногда на 3.

В дампе пишет что "Потоком была предпринята попытка прочитать или записать данные на виртуальный адрес, к которому он не имеет соответствующего доступа". Код исключения 0xC0000005.

Если же заменить detach на join - то всё работает, только тормоза, конечно же, никуда не деваются.

Я уже даже не знаю что думать в причины.
 
Два варианта ответа для разных уровней дзена.
1. Смотрите, что в аргументах передаете потоку. Эти аргументы живут в вызывающем потоке, как только вы второй отцепили, они сразу же будут прибиты, а второй поток об этом не узнает и будет их пытаться использовать, и либо нагрузит вам в базу мусора, либо вызовет av, что еще хороший исход (вам повезло, да).
2. Добавьте в (стандартный) <thread> первую строку следующего вида:
Код
#error This garbage should never be used in production code.
 
Да, спасибо большое, помогло. Странно что это так, в уроках которые я смотрел было сказано что если не использовать ref() при вызове функции в новый поток, то значение передаётся по значению. Теперь вызываю без параметров, всё нужное в глобальную переменную положил.
 
Цитата
Виктор написал:
если не использовать ref() при вызове функции в новый поток, то значение передаётся по значению
Конструктор делает move() того, что ему дали. Подразумевается, что передается именно плюсовый объект, что он отработает мув и потом деструктор в основном потоке увидит, что прибивать уже нечего. Или POD (но не указатель), где по барабану на мув. С сишным указателем, например, будут проблемы, это та же ссылка вид сбоку.

А вообще поток создавать стоит только если ожидается хотя бы пара секунд его работы, там очень существенный оверхед. Под мелкие задачи лучше поток из пула брать (тем же async хотя бы).
Страницы: 1
Читают тему (гостей: 1)
Наверх