关于boost :: asio :: io_service ::运行到多线程

时间:2012-01-27 13:24:52

标签: boost boost-asio

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

1 个答案:

答案 0 :(得分:2)

当您使用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)));
相关问题