所以共享的ptr和弱ptr是線程安全的,因爲如果你有一個給定線程本地對象的實例,並且它們共享一個公共的指向對象,你可以在一個線程中與另一個線程交互一切正常。
爲了正常工作,您必須正確使用它們。
wp.expired()
僅用於執行諸如「從緩衝區中刪除每個過期的弱ptr」之類的內容。它對你所說的目的沒有用處。
每個弱指針一旦過期仍然過期。但是,在你確認它已被使用之後,一個被吸引的弱指針可能會過度消失。
if(!wpPtr.expired()) {
// <<--- here
shared_ptr<Foo> spFoo = wpPtr.lock();
spFoo->DoSomething();
}
在<<--- here
我們知道在多線程環境沒有有關wpPtr
狀態。它可能已過期或未過期。在另一方面:
if(wpPtr.expired()) {
// <<--- there
}
在<<--- there
我們做知道弱指針已過期。
與文件io和其他類型的「事務性」操作一樣,檢查您是否可以做某事的唯一方法是嘗試去做。在確定你應該能夠做到並做到這一點之後,狀態可能會改變,操作可能會失敗。
你可以有時會發現,你幾乎可以肯定不能早做,這有時很有用,但是你不能確定你可以做,直到你嘗試。嘗試嘗試可能會失敗,此時您將處理該錯誤。
if(auto spFoo = wpPtr.lock()) {
spFoo->DoSomething();
}
這是與弱指針交互的「正確」方式。測試弱指針的有效性並在同一操作中獲取共享指針。
在if()
頭之外創建spFoo
是可以接受的,我更喜歡這種技術,因爲spFoo
的範圍僅限於其有效的區域。
的其他優選技術是早早出局,在那裏你寫你的代碼SFINAE友好:
auto spFoo = wpPtr.lock();
if(!spFoo) return error("wp empty");
spFoo->DoSomething();
這使得在一條直線的代碼流的「期望」執行無壓痕或條件或跳躍。
你放棄了報價的重要組成部分。這使得你的報價如此虛假我去檢查,看看如何解決cppreference。原來,這只是你的報價是錯誤的。 – Yakk