繁体   English   中英

提升async_write问题

[英]Boost async_write problem

我会展示一些代码;

void wh(const boost::system::error_code& ec,
        std::size_t bytes_transferred)
{
    std::cout << "test";
}

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService;
    boost::asio::serial_port pSerial(pService,"COM4");

    while (true) {
        boost::asio::async_write(pSerial, boost::asio::buffer("A",1),&wh);
    }

    return 0; 
} 

当我使用该代码我得到内存泄漏时,我发现一些代码如minicom_client教程甚至从该代码复杂,我也在minicom_client上得到内存泄漏。 如果我使用

    boost::asio::write(pSerial, boost::asio::buffer("A",1));

而不是async_write它运作良好,你能解释那里发生了什么,非常感谢...

你没有正确使用async_write 它是一个组合操作,由应用程序负责确保在调用写入处理程序之前不会对pSerial上的async_write进行其他调用。 文档很好地总结了这一点

此操作是根据对流的async_write_some函数的零次或多次调用实现的,并且称为组合操作。 程序必须确保流不执行任何其他写操作(例如async_write,流的async_write_some函数或执行写入的任何其他组合操作),直到此操作完成。

我强调的是。 要修复应用程序,您需要在wh()方法中启动其他async_write操作。 您还需要调用io_service::run()启动异步事件循环。 如果您不熟悉这个概念,我建议您在编写自己的代码之前研究这些示例

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService;
    boost::asio::serial_port pSerial(pService,"COM4");

    boost::asio::async_write(
        pSerial,
        boost::asio::buffer("A",1),
        boost::bind(
            &wh,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred
       );

    pService.run();

    return 0; 
} 

由于在调用处理程序之前缓冲区将超出范围,所以写入代码也是值得注意的。 通常,这是通过将缓冲区保留为通过boost::bind boost::shared_ptr传递给async_write处理程序的对象的成员来实现的。 这个概念在asio示例中很普遍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM