共享指针生命周期

Posted

技术标签:

【中文标题】共享指针生命周期【英文标题】:Shared pointer lifetime 【发布时间】:2019-12-27 15:13:04 【问题描述】:

如果我取消引用 shared_ptr 并在包含的对象上调用方法,shared_ptr 的生命周期是否得到保证?

假设:

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

其中linkInfoPtrshared_ptr 并存储在流对象中。这是否意味着如果linkInfoPtraddTxRxBytes 调用期间被另一个线程销毁,我将面临段错误?

【问题讨论】:

只要您有一个指向对象的共享指针(共享对象的所有权),该对象就会保持活动状态。如果您将共享指针按值(从而共享所有权)传递给线程,则指向的对象不会结束其生命周期 是的,但是在这个范围内,我没有 shared_ptr 的副本,这意味着我可能会在这里创建一个段错误的可能性,对吧? 但是linkInfoPtr 不是共享指针对象的副本吗?只要你有这个副本,并且linkInfoPtr 没有结束它自己的生命周期,它共享所有权的对象就会保持活动状态。 请贴出真实的代码而不是模糊的解释。 如果您有数据竞争,那么获取副本将无济于事。如果另一个线程破坏了linkInfoPtr,就在你准备复制它的时候,就在auto linkPtr = stream.linkInfoPtr执行的时候?您应该专注于消除程序中的数据竞争,而不是试图避免其后果——后者是不可能的。 【参考方案1】:

如果另一个线程以与行不同步的方式销毁linkInfoPtr's

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

在此线程中,您的程序存在数据竞争,因此存在未定义的行为。

只有原子变量可以潜在地并行访问以进行读写,而无需任何额外的同步,例如通过互斥锁或原子操作。

linkInfoPtrstd::shared_ptr 或者它的写入和读取目的都无关紧要。这适用于所有非原子类型。

即使对于原子类型,您也会有未定义的行为,因为一个可能的访问顺序是 linkInfoPtr 在另一行执行之前被销毁,在这种情况下,由于访问超出 -终生。


每个线程都需要自己的std::shared_ptr 副本,然后您可以保证std::shared_ptr 共享所有权的对象以及您正在调用addTxRxBytes 的对象是活动的,直到调用线程销毁其@ 实例987654329@.

【讨论】:

以上是关于共享指针生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Vue入门必备知识篇03--- 生命周期 & 数据共享

Vue组件的生命周期 & 数据共享

六组件的生命周期与组件间之间的数据共享

六组件的生命周期与组件间之间的数据共享

六组件的生命周期与组件间之间的数据共享

指针是不是会延长自动存储变量的生命周期? [复制]