2012-08-23 100 views
0

我有一個boost::shared_ptr<Map>,並且這個映射正在被多個線程修改,我需要使用顯式互斥還是線程正在通過共享指針修改映射的事實,我會得到某種隱含的線程安全性?存儲在共享指針中的對象的線程安全

+4

編號'shared_ptr'絕對不會爲線程安全做任何事情。它所做的只是爲動態分配的對象提供引用計數語義。 –

+1

你的問題的簡短答案是「否」。 'shared_ptr'提供的線程安全只適用於指針本身。它沒有做任何事來保護對象本身。一旦你從'shared_ptr'結構中得到一個指向底層對象的指針,你就不會再有魔法了。 –

+0

@DavidSchwartz我總是通過間接訪問對象到shared_ptr,而不是通過原始指針。這將提供線程安全嗎? – Jimm

回答

2

Did you even look at the docs?

shared_ptr對象提供線程安全的同一級別的內置 類型。一個shared_ptr實例可以被多個線程同時「讀取」(僅使用const 操作訪問)。不同的shared_ptr 實例可以被「寫入」 simultaneosly由多個線程(使用可變操作,例如 如操作者訪問=或復位)(即使當 這些實例是副本,並共享下方相同的參考計數 。)

任何其他同時訪問都會導致未定義的行爲。

編輯:它看起來像你問的是指向的對象,而不是指針本身。在這種情況下,根本沒有線程安全高管。爲什麼會有?

+0

如果您正在讀取的指針有可能發生變化,那麼讀取它並不安全,遠不及常規指針。常規指針是一個單詞,共享指針是指向該對象的指針和指向計數的單獨指針。因此從任何架構上讀取它都不是固有的原子。因此,一個問題是你可以讀取一個值和一個不匹配的計數器......另一個問題是,如果共享指針改變了,那麼可能會在另一個線程通過讀取它的方式刪除該對象。 ref-count的增量可能會損壞。 –

1

shared_ptr與內置類型具有相同的線程安全級別。

您可以同時從多個線程執行讀取(常量)操作。

您還可以在不同的shared_ptr實例中同時執行來自多個線程的寫操作(即使用可變操作,例如operator=reset)。這包括這些實例共享相同引用計數的情況(因爲shared_ptr爲ref計數器提供了原子增量/減量)。

如果您需要任何其他類型的訪問權限,您需要同步它,否則您將得到未定義的行爲。

相關問題