【问题标题】:Boost async_write problem提升 async_write 问题
【发布时间】:2011-02-15 22:42:16
【问题描述】:

我会展示一些代码;

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 它工作得很好,你能解释一下那里发生了什么吗,非常感谢......

【问题讨论】:

  • 你使用的是什么版本的 boost?

标签: c++ boost boost-asio


【解决方案1】:

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

这个操作是按照术语来实现的 对流的零个或多个调用 async_write_some 函数,并且是 称为组合操作。 该 程序必须确保流 不执行其他写操作 (例如 async_write,流的 async_write_some 函数,或任何 执行的其他组合操作 写)直到这个操作 完成。

我添加的重点。要修复您的应用程序,您需要启动额外的async_write 在您的 wh() 方法中进行操作。您还需要调用io_service::run()kick off 异步事件循环。如果你对这个概念不熟悉,我建议在编写自己的代码之前研究examples

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::bindboost::shared_ptr 传递给async_write 处理程序。这个概念在 asio 示例中很普遍。

【讨论】:

  • @hansen 我已经添加了一个示例。
  • 仅供参考:提供的代码 sn-p OP 大部分是正确的。唯一没有考虑到的是,从端口发送数据比调用 async_write 需要更长的时间。您将写入完成事件排队到 io_service 队列中的速度比完成它们的速度要快。文档说您一次不能从多个线程对同一个对象调用多个写操作。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多