共享指针生命周期
Posted
技术标签:
【中文标题】共享指针生命周期【英文标题】:Shared pointer lifetime 【发布时间】:2019-12-27 15:13:04 【问题描述】:如果我取消引用 shared_ptr
并在包含的对象上调用方法,shared_ptr 的生命周期是否得到保证?
假设:
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
其中linkInfoPtr
是shared_ptr
并存储在流对象中。这是否意味着如果linkInfoPtr
在addTxRxBytes
调用期间被另一个线程销毁,我将面临段错误?
【问题讨论】:
只要您有一个指向对象的共享指针(共享对象的所有权),该对象就会保持活动状态。如果您将共享指针按值(从而共享所有权)传递给线程,则指向的对象不会结束其生命周期 是的,但是在这个范围内,我没有 shared_ptr 的副本,这意味着我可能会在这里创建一个段错误的可能性,对吧? 但是linkInfoPtr
不是共享指针对象的副本吗?只要你有这个副本,并且linkInfoPtr
没有结束它自己的生命周期,它共享所有权的对象就会保持活动状态。
请贴出真实的代码而不是模糊的解释。
如果您有数据竞争,那么获取副本将无济于事。如果另一个线程破坏了linkInfoPtr
,就在你准备复制它的时候,就在auto linkPtr = stream.linkInfoPtr
执行的时候?您应该专注于消除程序中的数据竞争,而不是试图避免其后果——后者是不可能的。
【参考方案1】:
如果另一个线程以与行不同步的方式销毁linkInfoPtr
's
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
在此线程中,您的程序存在数据竞争,因此存在未定义的行为。
只有原子变量可以潜在地并行访问以进行读写,而无需任何额外的同步,例如通过互斥锁或原子操作。
linkInfoPtr
是 std::shared_ptr
或者它的写入和读取目的都无关紧要。这适用于所有非原子类型。
即使对于原子类型,您也会有未定义的行为,因为一个可能的访问顺序是 linkInfoPtr
在另一行执行之前被销毁,在这种情况下,由于访问超出 -终生。
每个线程都需要自己的std::shared_ptr
副本,然后您可以保证std::shared_ptr
共享所有权的对象以及您正在调用addTxRxBytes
的对象是活动的,直到调用线程销毁其@ 实例987654329@.
【讨论】:
以上是关于共享指针生命周期的主要内容,如果未能解决你的问题,请参考以下文章