2012-06-05 24 views
1

我指的是代碼在連接類的boost :: ASIO HTTP Server 3的例子http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/http/server3/connection.cpp的boost ::跨線程ASIO插槽共享HTTP服務器中的3例

可以看出,每個異步的操作在boost :: asio :: io_service :: strand上被調用。這確保了完成處理程序不會被同時調用。但是,示例服務器可以使用多個調用io_service :: run的線程運行,這意味着可以使用這些線程中的任何一個來調用處理程序。本例中的所有處理程序都調用boost :: asio :: ip :: tcp :: socket對象上的方法。對我來說,這是在線程之間共享套接字對象(儘管不是同時調用它的方法)。

我可以看到圍繞套接字調用沒有同步,所以我的問題是確保每個線程都具有相同的套接字對象狀態視圖的機制?該文檔明確指出,共享boost :: asio :: ip :: tcp :: socket的實例是不安全的。

回答

0

該文檔指出tcp :: socket不是線程安全作爲共享對象。

我使用線程安全的,這是被廣泛接受的SGI STL定義:

的SGI實現STL是線程安全只有在這個意義上,同時訪問不同容器是安全的,並同時進行讀取訪問共享容器是安全的。如果多個線程訪問單個容器,並且至少有一個線程可能會寫入,則用戶負責確保容器訪問期間線程之間的相互排斥。

關鍵詞是同時。因此,只要訪問不是併發的,使用多線程訪問共享對象就沒有問題。順便說一句,這隻在一個或多個線程正在寫入共享對象時才重要。

套接字對象的狀態位於進程的內存空間中,該空間在線程之間共享,因此不能不一致。

希望這回答你的問題!