2012-01-27 80 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))); 
相關問題