簡體   English   中英

共享指針生命周期

[英]Shared pointer lifetime

如果我取消引用shared_ptr並調用包含對象的方法,是否保證 shared_ptr 生命周期?

讓我們說:

stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );

其中linkInfoPtrshared_ptr並存儲在流對象中。 這是否意味着,如果linkInfoPtr會從另一個線程中被破壞addTxRxBytes調用我將面臨一個段錯誤?

如果另一個線程以與行不同步的方式破壞了linkInfoPtr

stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );

在此線程中,您的程序會出現數據競爭,因此存在未定義的行為。

只有原子變量可以潛在地並行訪問以進行讀寫,而無需任何額外的同步,例如通過互斥鎖或原子操作。

linkInfoPtrstd::shared_ptr或者它被寫入和讀取的目的完全無關緊要。 這適用於所有非原子類型。

即使對於原子類型,您也會有未定義的行為,因為一種可能的訪問順序是在執行另一行之前銷毀linkInfoPtr ,在這種情況下,由於訪問生命周期外,您有未定義的行為。


每個線程都需要自己的std::shared_ptr副本,然后您可以保證std::shared_ptr共享所有權的對象以及您正在調用addTxRxBytes的對象是活着的,直到調用線程銷毀其std::shared_ptr實例.

暫無
暫無

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

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