[英]Shared pointer lifetime
如果我取消引用shared_ptr
並調用包含對象的方法,是否保證 shared_ptr 生命周期?
讓我們說:
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
其中linkInfoPtr
是shared_ptr
並存儲在流對象中。 這是否意味着,如果linkInfoPtr
會從另一個線程中被破壞addTxRxBytes
調用我將面臨一個段錯誤?
如果另一個線程以與行不同步的方式破壞了linkInfoPtr
的
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
在此線程中,您的程序會出現數據競爭,因此存在未定義的行為。
只有原子變量可以潛在地並行訪問以進行讀寫,而無需任何額外的同步,例如通過互斥鎖或原子操作。
linkInfoPtr
是std::shared_ptr
或者它被寫入和讀取的目的完全無關緊要。 這適用於所有非原子類型。
即使對於原子類型,您也會有未定義的行為,因為一種可能的訪問順序是在執行另一行之前銷毀linkInfoPtr
,在這種情況下,由於訪問生命周期外,您有未定義的行為。
每個線程都需要自己的std::shared_ptr
副本,然后您可以保證std::shared_ptr
共享所有權的對象以及您正在調用addTxRxBytes
的對象是活着的,直到調用線程銷毀其std::shared_ptr
實例.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.