如果我取消引用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
实例为止。关于c++ - 共享指针生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59502633/