【问题标题】:About boost::asio::io_service::run into multithread关于 boost::asio::io_service::run 进入多线程
【发布时间】:2012-01-27 13:24:51
【问题描述】:

boost doc 说 io_service 可以以任意方式跨线程分配工作,这是否意味着当我使用 TCP 套接字时,我可能会接收到无序的数据?因为我的接收处理程序可能以任意方式跨线程分布。

【问题讨论】:

  • 您能否提供更多有关您的用例的信息?通常,您使用链来保护对单个套接字的访问,因此您的应用程序将同时通信多个不同的连接,但单个套接字上的请求是串行处理的。

标签: boost boost-asio


【解决方案1】:

当您使用 boost io_service 安排 async_read 或读取时,您对套接字进行操作。通过socket->read(...)read(socket ...)。如果您查看文档,有一些变体接受完成读取的标准、字节数或匹配条件。使用这个你可以有一个连接,它给你说 20 个字节的数据,你以 10 个字节将它读取到一个线程,当该线程正在处理数据时,接下来的 20 个字节转到另一个线程。在少数情况下您可能想要这样做,但通常您会希望每个线程读取整个数据包。

如果您想确保一次只有一个线程处理来自套接字的 io,您可以将回调包装在 strand 中。这是一个相当通用的示例。

boost::asio::async_read(socket, 
                        buffer(*responseBuffer), 
                        transfer_all(),
                        strand.wrap(boost::bind(&YourClass::handleRead, 
                                                 this, /*or use shared_from_this*/
                                                 placeholders::error)));

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 2017-09-17
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多