我需要一些帮助来解决这个异常,我正在实现一个 NPAPI 插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用 Firebreath 框架。
对于套接字和连接,我使用带有异步调用的 Boost asio 和一个包含 5 个工作线程的线程池。 我还为每个线程设置了截止日期以实现传输超时。
我使用插件的扩展工作流程是这样的:
- 打开套接字 1(这会启动 async_receive 和截止时间 异步等待)
- 写入套接字1
获取响应1
打开另一个socket 2
在套接字2中写入
写套接字1
关闭套接字 1 (socket.cancel(), deadline.cancel(), socket.shutdown(), socket 发布)。
获取响应2
- 写套接字2
- 关闭套接字 2
因为一切都是跨语言的,异步确实很难调试,但所有打开、写入或关闭都是从 javascript 调用的,从套接字 1 读取的顺序调用打开 2、写入 2、写入 1 和关闭 1。
也许我所说的一切都是不相关的,因为抛出异常时调用堆栈不显示我的任何函数,只显示它在调用 _heap_alloc_dbg_impl的
malloc
中
事实上,它通常在第 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 进程在崩溃时关闭所有内容。
最佳答案
我通过继续检查其他线程发现了错误。我发现 Firebreath 调用的主要类正在被销毁。再检查一点我发现这完全是我的错我有一个类用于存储需要在主体类中使用函数的套接字信息(我不喜欢它但这是我发现使用它的唯一方法)所以我在主类中添加了一个shared_ptr
。因此,如果它在销毁那些 SocketInfo
对象之后因为没有其他对象,则 ptr 引用计数达到 0 并且主体类正在被销毁。
有趣的是套接字通常在使用后正常关闭,所以我看不出为什么在没有打开套接字时不触发这种情况,而只在连续打开和关闭 2 个套接字时发生。
无论如何,我在截止日期处理程序中也遇到了 shared_from_this
错误,但这似乎无关。
现在它似乎可以在任意数量的线程中正常工作。
关于c++ - boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554053/