如果我取消引用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实例为止。

关于c++ - 共享指针生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59502633/

10-08 22:50