повышение :: exception_detail :: clone_impl & л; повышение :: exception_detail :: error_info_injector & л; повышение :: thread_resource_error & GT; & GT;

Мне нужна помощь с этим исключением, я реализую плагин NPAPI, чтобы иметь возможность использовать локальные сокеты из расширений браузера, для этого я использую фреймворк Firebreath.

Для сокетов и подключения я использую Boost asio с асинхронными вызовами и пул потоков из 5 рабочих потоков.
Также у меня есть крайний срок для каждого потока для реализации тайм-аута передачи.

Мой рабочий процесс расширения с плагином выглядит так:

  1. Откройте сокет 1 (запускается async_receive и заканчивается срок
    async_wait)
  2. Написать в розетку 1
  3. Получить ответ 1

  4. Откройте другое гнездо 2

  5. Напиши в розетку 2

  6. Написать сокет 1

  7. Закрыть розетку 1
    (socket.cancel (), deadline.cancel (), socket.shutdown (), сокет
    релиз).

  8. Получить ответ 2

  9. Написать сокет 2
  10. Закрыть розетку 2

Поскольку все на разных языках, и асинхронность действительно трудно отладить, но все open, write или close вызываются из javascript, а чтение из сокета 1 вызывает open 2, write 2, write 1 и close 1 в этом порядке.

Может быть, все, что я говорю, не связано, поскольку стек вызовов, когда генерируется исключение, не показывает ни одну из моих функций, а только показывает, что он находится внутри malloc что вызывает _heap_alloc_dbg_impl

Как это обычно происходит во 2-м или 3-м полном цикле, и кажется, что это происходит между шагами 5 и 7.

Но я думаю, что это должно быть связано с тем, что выполнение всего одного рабочего потока приводит к сбою, за исключением первого цикла.

Я открыт для публикации дополнительной информации, если вам это нужно.

Обновление 1:

VS при взломе

Обновление 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, чтобы закрыть все, когда он падает.

6

Решение

Я нашел ошибки, продолжая проверять другие темы. Я обнаружил, что мой основной класс, который вызывал Огненное дыхание, находился в процессе уничтожения. Осмотрев немного больше, я обнаружил, что это была моя вина: у меня есть класс для хранения информации о сокетах, которая необходима для использования функции в основном классе (мне это не понравилось, но это был единственный способ, которым я нашел это) поэтому я добавил shared_ptr в основной класс. Так что если после уничтожения на тех SocketInfo Объекты, так как других не было, счетчик ссылок ptr достиг 0 и основной класс уничтожался.

Интересно то, что сокеты обычно закрываются нормально после использования, поэтому я не вижу причин, почему это не срабатывало, когда не было открытых сокетов, а происходило только тогда, когда два сокета открывались и закрывались подряд.

Во всяком случае у меня также был shared_from_this ошибка с обработчиком крайнего срока, но это казалось несвязанным.

И теперь кажется, что он работает, как и ожидалось, с любым количеством потоков.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]