Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享指针生存期_C++_C++11_Shared Ptr - Fatal编程技术网

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
,该怎么办?您应该集中精力消除程序中的数据竞争,而不是试图避免其后果——后者是不可能的。