Мне нужна помощь с этим исключением, я реализую плагин NPAPI, чтобы иметь возможность использовать локальные сокеты из расширений браузера, для этого я использую фреймворк Firebreath.
Для сокетов и подключения я использую Boost asio с асинхронными вызовами и пул потоков из 5 рабочих потоков.
Также у меня есть крайний срок для каждого потока для реализации тайм-аута передачи.
Мой рабочий процесс расширения с плагином выглядит так:
Получить ответ 1
Откройте другое гнездо 2
Напиши в розетку 2
Написать сокет 1
Закрыть розетку 1
(socket.cancel (), deadline.cancel (), socket.shutdown (), сокет
релиз).
Получить ответ 2
Поскольку все на разных языках, и асинхронность действительно трудно отладить, но все open, write или close вызываются из javascript, а чтение из сокета 1 вызывает open 2, write 2, write 1 и close 1 в этом порядке.
Может быть, все, что я говорю, не связано, поскольку стек вызовов, когда генерируется исключение, не показывает ни одну из моих функций, а только показывает, что он находится внутри malloc
что вызывает _heap_alloc_dbg_impl
Как это обычно происходит во 2-м или 3-м полном цикле, и кажется, что это происходит между шагами 5 и 7.
Но я думаю, что это должно быть связано с тем, что выполнение всего одного рабочего потока приводит к сбою, за исключением первого цикла.
Я открыт для публикации дополнительной информации, если вам это нужно.
Обновление 1:
Обновление 2:
Всего запущено 10 тем:
workPtr.reset( new boost::asio::io_service::work(io_service));
for ( int i = 0; i < 10; ++i) {
m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );
}
11-й _threadstartex Я не знаю, кто его запустил
В другом потоке (не тот, который VS считает вызывающим сбой) существует join_all()
в процессе, потому что мой класс уничтожается, но я думаю, что не должен, так что, возможно, этот сбой происходит из-за другого исключения и процесса Firebreath, чтобы закрыть все, когда он падает.
Я нашел ошибки, продолжая проверять другие темы. Я обнаружил, что мой основной класс, который вызывал Огненное дыхание, находился в процессе уничтожения. Осмотрев немного больше, я обнаружил, что это была моя вина: у меня есть класс для хранения информации о сокетах, которая необходима для использования функции в основном классе (мне это не понравилось, но это был единственный способ, которым я нашел это) поэтому я добавил shared_ptr
в основной класс. Так что если после уничтожения на тех SocketInfo
Объекты, так как других не было, счетчик ссылок ptr достиг 0 и основной класс уничтожался.
Интересно то, что сокеты обычно закрываются нормально после использования, поэтому я не вижу причин, почему это не срабатывало, когда не было открытых сокетов, а происходило только тогда, когда два сокета открывались и закрывались подряд.
Во всяком случае у меня также был shared_from_this
ошибка с обработчиком крайнего срока, но это казалось несвязанным.
И теперь кажется, что он работает, как и ожидалось, с любым количеством потоков.
Других решений пока нет …