boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector <boost :: thread_resource_error>&gt; </boost :: exception_detail :: error_info_injector <boost :: thread_resource_error>

时间:2013-03-21 17:19:47

标签: c++ visual-c++ boost-asio boost-thread firebreath

我需要一些关于此异常的帮助,我正在实现一个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(),socket 发布)。

  8. 获得回复2

  9. 写入套接字2
  10. 关闭套接字2
  11. 因为一切都是交叉语言而且异步很难调试但是所有打开,写入或关闭都是从javascript调用的,从套接字1中读取,调用open 2,write 2,write 1并按顺序关闭1。 / p>

    也许我告诉的事情是无关紧要的,因为抛出异常时调用堆栈没有显示我的任何函数,只显示它位于调用malloc的{​​{1}}内

    因为它通常在第2或第3个完整周期失败,而且似乎发生在第5步和第7步之间。

    但是,我认为它必须与asio相关,因为使用单个工作线程执行所有操作只会在第一个循环中与异常崩溃。

    如果您需要,我愿意发布更多信息代码。

    更新1:

    VS when breaking

    更新2:

    有10个线程启动:

    _heap_alloc_dbg_impl

    第11届_threadstartex我不知道是谁推出了它

    在另一个线程(不是VS声称导致崩溃的那个)上有一个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) ); } 正在进行,因为我的类正在被销毁,但我认为它不应该,所以这个崩溃可能是由于另一个异常和Firebreath进程在崩溃时关闭所有内容。

1 个答案:

答案 0 :(得分:12)

我通过继续检查其他线程找到了错误。我发现Firebreath正在调用的主要课程正在被摧毁。多检查一下,我发现完全是我的错,我有一个类来存储需要在主类中使用函数的套接字信息(我不喜欢它,但这是我发现使用它的唯一方法)所以我在主要类中添加了shared_ptr。因此,如果在销毁那些SocketInfo对象之后没有其他对象,则ptr引用计数达到0并且主要类被销毁。

有趣的是套接字在使用后通常会正常关闭,因此我没有理由在没有套接字打开时触发这种情况,只有在连续打开和关闭的2个套接字时才会发生这种情况。

无论如何,我在截止日期处理程序中也遇到shared_from_this错误,但这似乎没有关联。

现在它似乎正在按预期运行任意数量的线程。