共享指针生命周期
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
.
的实例
如果我取消引用 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
.