代码之家  ›  专栏  ›  技术社区  ›  frisco

boost::exception_detail::clone_inimpl<boost:;exception_delete::error_info_injector<boost::thread_resource_error>>

  •  7
  • frisco  · 技术社区  · 11 年前

    我需要一些帮助来解决这个例外,我正在实现一个NPAPI插件,以便能够使用浏览器扩展中的本地套接字,为此,我正在使用Firebreath框架。

    对于套接字和连接,我将Boost asio与异步调用和5个工作线程的线程池结合使用。 此外,我每个线程都有一个最后期限来实现传输超时。

    我的插件扩展工作流程如下:

    1. 打开套接字1(这将启动async_receive和截止日期 异步等待)
    2. 写入插槽1
    3. 获取响应1

    4. 打开另一个插座2

    5. 写入插槽2

    6. 写入套接字1

    7. 关闭插座1 (socket.caccel(),deadline.caccel),socket.shutdown(),套接字 释放)。

    8. 获取响应2

    9. 写入套接字2
    10. 关闭插座2

    由于所有东西都是跨语言的,异步真的很难调试,但所有的打开、写入或关闭都是从javascript调用的,而从套接字1读取则按顺序调用打开2、写入2、写入1和关闭1。

    也许我所说的每一件事都是无关的,因为当抛出异常时,调用堆栈不会显示我的任何函数,只显示它在 malloc 呼叫 _heap_alloc_dbg_impl

    事实上,它通常在第二个或第三个完整循环中失败,并且似乎发生在步骤5和7之间。

    但是,我认为这一定与asio有关,因为用一个工作线程做任何事情都会在第一个循环中出现异常而崩溃。

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

    更新1:

    VS when breaking

    更新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次线程启动我不知道是谁启动的

    在另一个线程(而不是VS声称导致崩溃的线程)上,有一个 join_all() 正在处理中,因为我的类正在被销毁,但我认为它不应该被销毁,所以这次崩溃可能是由于另一个异常和Firebreath进程导致的,当它崩溃时,它会关闭所有东西。

    1 回复  |  直到 11 年前
        1
  •  12
  •   Sam Miller    11 年前

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

    有趣的是,插座在使用后通常会正常关闭,所以我看不出为什么在没有打开插座的情况下没有触发,而只有在连续打开和关闭两个插座时才会触发。

    不管怎样,我也有 shared_from_this 最后期限处理程序出现错误,但这似乎无关。

    现在看来,它可以像预期的那样使用任意数量的线程。