使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误

Posted

技术标签:

【中文标题】使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误【英文标题】:boost::property_tree::read_xml segfaults in an asio handler spawned using boost::asio::spawn 【发布时间】:2016-12-08 01:26:23 【问题描述】:

以下代码在 boost::property_tree::read_xml() 调用时因段错误而崩溃。 只有在使用 boost::asio::spawn() 生成的 io_service 处理程序中调用它时才会发生这种情况。如果处理程序刚刚发布,它可以正常工作。 是否有解决方法或解决方法? (提升 1.61)

#include <boost/asio/spawn.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include <sstream>
#include <thread>

void process()

    std::cerr << "start"<< std::endl;
    std::istringstream is("<t>1</t>");
    boost::property_tree::ptree pt;
    boost::property_tree::read_xml(is, pt); // <<< seg fault here
    std::cerr << std::endl << "end" << std::endl;


int main()

    boost::asio::io_service io_service;
    boost::asio::spawn(io_service, [] (boost::asio::yield_context y)
        process();
    );
    io_service.run();
    return 0;

【问题讨论】:

【参考方案1】:

经过一番挖掘,我们发现seg错误是由协程的堆栈溢出引起的,因为boost::property_tree::read_xml()中使用的rapidxml解析器默认为每个xml文档中的静态内存池分配了64KB的堆栈。

解决办法是按如下方式减小池的大小:

#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512
#include <boost/property_tree/xml_parser.hpp>

另一种解决方案是增加协程的堆栈大小。

【讨论】:

以上是关于使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误的主要内容,如果未能解决你的问题,请参考以下文章

列表生成式的进化版——生成器

使用GAN(生成对抗网络)进行图像生成

使用生成对抗网络(GAN)生成手写字

ai形状生成器怎么使用的方法

QFramework 使用指南 2020:脚本生成生成 Prefab

使用C#编写自己的代码生成器,附代码讲解