[英]Boost Shared Pointer: Simultaneous Read Access Across Multiple Threads
我有一個線程A,它分配內存並將其分配給共享指針。 然后,該線程產生3個其他線程X,Y和Z,並將共享指針的副本傳遞給每個線程。 當X,Y和Z超出范圍時,釋放內存。 但是有可能2個線程X,Y在完全相同的時間點超出范圍並且在引用計數上存在競爭條件,因此不是將其遞減2,而是僅遞減一次。 所以,現在引用計數更新為0,因此存在內存泄漏。 請注意,X,Y和Z僅讀取內存。 不寫入或重置共享指針。 長話短說,引用計數是否存在競爭條件,是否會導致內存泄漏?
boost::shared_ptr
使用鎖(或無鎖原子訪問)來確保引用計數以原子方式更新(即使從文檔頁面中不清楚)。 如果通過定義宏BOOST_SP_DISABLE_THREADS
編寫單線程代碼,則可以配置鎖的使用。
請注意http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety中討論來自不同線程的多次寫入問題的文檔示例正在討論作用於相同shared_ptr
實例的那些線程( shared_ptr
對象可能是示例中的全局變量),而不是指向同一對象的不同shared_ptr
副本,這是shared_ptr
的常見用例。 您在問題中提供的示例(作用於指向共享對象的副本)是線程安全的。
不,根據文檔 ,這些問題不會發生:
不同的
shared_ptr
實例可以被多個線程同時“寫入”(使用諸如operator =或reset之類的可變操作進行訪問)( 即使這些實例是副本,並且在下面共享相同的引用計數 。)
其他幾個人已經提供了文件的鏈接,說明這是安全的。
有關絕對無可辯駁的證據,請參閱Boost Smartptr如何在boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
(或您平台的相應文件)中從頭實際實現自己的互斥鎖。
文件說:
不同的shared_ptr實例可以被多個線程同時“寫入”(使用諸如operator =或reset之類的可變操作進行訪問)(即使這些實例是副本,並且在下面共享相同的引用計數。)
因此,如果沒有任何線程訪問其他線程的指針對象,它應該沒問題。 請查看文檔中的示例,並查看與您的案例相關的示例。
最好的辦法是升級到TR1或C ++ 0x shared_ptr,而不是Boost變種。 我相信標准化必須是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.