2014-06-24 55 views
0

關於boost.asio複合操作有幾點不清楚,這些操作在官方文檔和我已閱讀的主題中的各種線程中都不清楚。boost.asio在單線程和多線程進程中的複合操作

場景

兩個boost::asio::async_write請求A和B被安排在一個TCP套接字。

問題

  1. 在單線程處理中,可能發生的是A被同時地B所執行?也就是說,A的async_write_some的中間調用與B的調用(基本上呈現損壞的流)混合?
  2. 如果(1)的答案爲是,那麼io_service::strand是否解決了單線程過程中的問題?它是否確保在B之前完成A的所有中間呼叫開始?
  3. 請問io_service.strand是否解決了(1)在多線程進程中,當多個線程執行io_service::run()?它是否確保在B之前完成A的所有中間呼叫開始?
+0

文檔非常清晰,真的。它可能看起來不清楚,但這是因爲你腦海中存在一些「不清楚的主題」,例如proactor模式!無論如何,topnotch SO問題/答案,幫助我在我自己的學習曲線之一是[那個](http://stackoverflow.com/questions/15568100/confused-when-boostasioio-service-run-method-blocks-unblocks ?RQ = 1)。 –

+0

This [answer](http://stackoverflow.com/a/7756894/1053968)通過使用一個隊列來序列化多個'async_write()'操作,並用一個異步調用鏈處理隊列一個['strand'](http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service__strand.html),滿足'async_write()'的要求和流的線程安全。 –

回答

2

本細則明確規定:"The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes."

所以,多async_write的絕不能同時調用。在一個單線程的情況下,可以鏈接它們,在前一個完成處理程序中調用後續的async_write

如果io_service::run在多個線程中運行時,僅通過一個strand包裹async_write的完成處理程序,和ASIO will synchronize所有的中間內部處理程序。

+0

我相信「在前一個完成處理程序中調用隨後的async_write」也可以解決多線程情況,而不必包裝處理程序 – kispaljr

+0

@ igor -r是您的asnwer 1.是2.否否3.否否? – rbk

+0

@rbk是的,如果說「可以發生......」,那麼你的意思是「如果濫用......可以發生......」。 –