C++ 共享指针生存期
如果我取消引用一个C++ 共享指针生存期,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,如果我取消引用一个shared\u ptr并对包含的对象调用一个方法,那么共享的\u ptr生命周期有保证吗 比如说: stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes ); 其中linkInfoPtr是共享的\u ptr并存储在流对象中。这是否意味着如果linkInfoPtr在addtxbytes调用期间从另一个线程销毁,我将面临segfault?如果另一个线程以与行不同步的方式销毁linkInfoPtr stream.linkInf
shared\u ptr
并对包含的对象调用一个方法,那么共享的\u ptr生命周期有保证吗
比如说:
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
其中
linkInfoPtr
是共享的\u ptr
并存储在流对象中。这是否意味着如果linkInfoPtr
在addtxbytes
调用期间从另一个线程销毁,我将面临segfault?如果另一个线程以与行不同步的方式销毁linkInfoPtr
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
在这个线程中,程序有一个数据竞争,因此行为未定义
只有原子变量可能被并行访问以进行读写,而无需任何额外的同步,例如通过互斥或原子操作
linkInfoPtr
是一个std::shared\u ptr
或者它的写入和读取目的都无关紧要。这适用于所有非原子类型
即使对于原子类型,您也会有未定义的行为,因为一种可能的访问顺序是在执行另一行之前销毁linkInfoPtr
,在这种情况下,您会有未定义的行为,因为访问超出了生存期
每个线程都需要自己的
std::shared_ptr
副本,然后保证std::shared_ptr
对象共享所有权,并且只要您有一个共享线程,您正在调用的addtxxbytes
就处于活动状态,直到调用线程销毁其std::shared_ptr
实例指向对象(共享对象所有权)的指针对象将保持活动状态。如果按值传递共享指针(从而共享所有权)到线程,指向的对象将不会结束其生命周期是的,但在此范围内,我没有共享指针对象的副本,这意味着我可能在这里创建segfault,对吗?但linkInfoPtr
不是共享指针对象的副本吗?只要您拥有此副本,并且linkInfoPtr
不会结束其自身的生命周期,它共享所有权的对象将保持活动状态。请发布真实的代码,而不是含糊不清的解释。如果您有数据竞争,则获取副本将毫无帮助。如果另一个线程在您即将复制它时销毁了linkInfoPtr
,而此时执行了auto-linkPtr=stream.linkInfoPtr
,该怎么办?您应该集中精力消除程序中的数据竞争,而不是试图避免其后果——后者是不可能的。