Мне нужна помощь с этим исключением, я внедряю плагин NPAPI, чтобы иметь возможность использовать локальные сокеты из расширений браузера, для этого я использую платформу Firebreath.
Для сокета и подключения я использую Boost asio с асинхронными вызовами и пулом из 5 рабочих потоков. Также у меня есть крайний срок для каждого потока для реализации тайм-аута передачи.
Мой рабочий процесс расширения с плагином выглядит следующим образом:
- Откройте сокет 1 (это запускает async_receive и крайний срок async_wait)
- Запись в сокете 1
Получить ответ 1
Откройте другой сокет 2
Запись в сокете 2
Запись сокета 1
Закройте сокет 1 (socket.cancel(), dead.cancel(), socket.shutdown(), освобождение сокета).
Получить ответ 2
- Запись сокета 2
- Закрыть сокет 2
Поскольку все на разных языках, а асинхронность действительно сложно отлаживать, но все операции открытия, записи или закрытия вызываются из javascript, а чтение из сокета 1 вызывает открытие 2, запись 2, запись 1 и закрытие 1 в указанном порядке.
Возможно, все, о чем я говорю, не имеет отношения к делу, поскольку стек вызовов при возникновении исключения не показывает ни одной из моих функций, а показывает только, что он находится внутри malloc
, который вызывает _heap_alloc_dbg_impl
Как правило, он выходит из строя во 2-м или 3-м полном цикле, и кажется, что это происходит между шагами 5 и 7.
Но я думаю, что это должно быть связано с asio, так как выполнение всего с одним рабочим потоком просто приводит к сбою, за исключением первого цикла.
Я готов опубликовать больше информации о коде, если вам это нужно.
Обновление 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 все, когда он падает.