2012-01-27 33 views
1

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

+0

您能提供一些关于您的用例的更多信息吗?一般而言,您保护对单个套接字的访问正在使用一个链,否则您的应用程序将同时传递多个不同的连接,但是单个套接字上的请求将被串行处理。 – mark 2012-01-27 22:02:31

回答

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))); 
相关问题