簡體   English   中英

boost :: shared_ptr在多個線程中使用它是否安全?

[英]boost::shared_ptr is it safe to use it in multiple threads?

我試圖找到答案一段時間,但我失敗了。

讓我們假設我們有一個從一個線程創建的shared_ptr 然后我們將此shared_ptr傳遞給另外2個線程(例如,使用某個隊列)。 所以從這一刻起,原始shared_ptr有兩個副本,指向同一個原始指針。 兩個所有者線程都將從隊列中獲取此shared_ptr的副本。 然后他們會將它傳遞給另一個線程或將其銷毀。

問題是 - 它安全嗎? 原始指針是否會被正確銷毀(沒有競爭引用計數器?) 在此輸入圖像描述

C ++標准幾乎不保證線程安全。 std::shared_ptr的引用計數是唯一的例外:它保證表現為原子訪問的變量。 我認為這是在§20.7.2.2/ 4中的這句話中編纂的:

use_count()更改不反映可能引入數據use_count()修改。

boost::shared_ptr 提供相同的保證

shared_ptr對象提供與內置類型相同的線程安全級別。 shared_ptr實例可以由多個線程同時“讀取”...。 不同的shared_ptr實例可以被多個線程同時“寫入”...(即使這些實例是副本,並在下面共享相同的引用計數。)

提升文檔聲明:

不同的shared_ptr實例可以被多個線程同時“寫入”(使用諸如operator =或reset之類的可變操作訪問)( 即使這些實例是副本,並在下面共享相同的引用計數。

(強調我的)

所以這里的關鍵是你是否在線程之間復制 boost::shared_ptr 如果您創建副本(使用shared_ptr的“安全”方式),您不必擔心線程安全。 但是,如果您通過引用或指針傳遞shared_ptr ,因此在不同的線程中使用實際相同的shared_ptr ,則必須擔心線程安全性,如文檔中所述。

我想在多線程用例中的boost共享指針中發布我的注釋用於引用計數。 評論是回答“升壓共享指針引用計數中是否存在任何競爭條件?”的問題。

對於大多數主流編譯器,至少在提升1.35之后我的簡單回答是“否”。 boost / detail / shared_count.hpp中定義的boost實現名為“add_ref_copy”。 該函數將調用為各個編譯器定義的相應原子函數。 例如,Windows版本將調用“BOOST_INTERLOCKED_INCREMENT”以原子方式遞增計數(詳細信息請參見\\ sp_counted_base_w32.hpp)。 X86的Linux gcc將調用atomic_increment(...)(詳見詳細信息\\ sp_counted_base_gcc_x86.hpp)。 每個單獨的編譯器都實現了線程安全機制,以確保以有效的方式更新引用計數。 有些代碼甚至是用匯編語言編寫的。

現在我的簡單答案中有一個警告。 您確實需要確保您的編譯器包含在boost的祝福列表中,以進行多線程安全引用計數。 如果您不確定是否可以定義“BOOST_SP_USE_PTHREADS”來驅動boost以使用pthread庫以原子方式進行引用計數更新(通過為pthread解決方案包含boost / detail / sp_counted_base_pt.hpp)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM