首頁  >  文章  >  後端開發  >  std::shared_ptr 對於它管理的物件來說是線程安全的嗎?

std::shared_ptr 對於它管理的物件來說是線程安全的嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-15 13:03:02257瀏覽

Is std::shared_ptr thread-safe for the object it manages?

std::shared_ptr 在多大程度上確保執行緒安全?

原始問題:

  1. 參考std::shared_ptr 中的計數保證是線程安全的並且與平台無關。
  2. 只有持有最後一個引用的執行緒才會對共享物件呼叫delete。
  3. std::shared_ptr 不為其儲存的物件提供任何執行緒安全性。

答案:

是的,前兩個問題是準確的。 std::shared_ptr 的參考計數和析構函式呼叫是線程安全的。

第三個問題也是正確的。 std::shared_ptr 不保證其中儲存的物件的線程安全。物件本身可能不是線程安全的,因此,在沒有適當同步的情況下從多個線程訪問它可能會導致未定義的行為。

範例:

考慮以下內容一塊偽代碼:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
  • 問題:
  • 問題:
答案:

不,只有d會指向新的A(10),而a, b,c會繼續指向原來的A(1)。

這是因為reset()不會影響其他執行緒對同一個物件的參考。 d 是唯一指向新實例的共用指針,而其他參考(a、b 和 c)將仍指向原始實例。

以上是std::shared_ptr 對於它管理的物件來說是線程安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn