c – weak_ptr如何知道共享资源已经过期?

c – weak_ptr如何知道共享资源已经过期?,第1张

概述考虑以下代码: #include <memory>#include <iostream>using namespace std;struct MySharedStruct{ int i;};void print_value_of_i(weak_ptr<MySharedStruct> weakPtr){ if (shared_ptr<MySharedStruct> sp 考虑以下代码:
#include <memory>#include <iostream>using namespace std;struct MySharedStruct{  int i;};voID print_value_of_i(weak_ptr<MySharedStruct> weakPtr){  if (shared_ptr<MySharedStruct> sp = weakPtr.lock())  { cout << "Value of i = " << sp->i << endl; }  else  { cout << "Resource has expired"; }}int main(){  shared_ptr<MySharedStruct> sharedPtr(new MySharedStruct() );  sharedPtr->i = 5;  weak_ptr<MySharedStruct> weakPtr;  weakPtr = sharedPtr;  print_value_of_i(weakPtr);  sharedPtr.reset(new MySharedStruct() ); // <<----- How does weak_ptr kNow it has expired after this line executes?  sharedPtr->i = 10;  print_value_of_i(weakPtr);  return 0;}

考虑到shared_ptr引用的资源已经被另一个资源所替代,weak_ptr知道它已经过期了吗?什么是weak_ptr跟踪,以确定旧的共享资源被销毁并被新的共享资源所替代?将会感谢在weak_ptr中锁定的方法的示例定义(如果相关).

解决方法 从plain指针创建shared_ptr时分配的控制块包含对象的引用计数器和对象本身的指针以及自定义的删除对象(如果有的话).当引用计数器达到零时,对象被释放,指针被设置为null.因此,当对象引用计数器为零时,意味着该对象已经消失.

对于x86和x86-64,它们使用原子 *** 作,没有明确的锁定(无互斥锁或自旋锁).实现的技巧是一个特殊的无锁(忙碌的代码语言)函数atomic_conditional_increment,只有当对象引用计数器不为零时才会递增.当多个线程尝试从相同的weak_ptr创建一个shared_ptr,对象引用计数器为零时,它用于执行weak_ptr :: lock函数来应对比赛.见http://www.boost.org/doc/libs/1_52_0/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp

控制块本身在shared_ptr和weak_ptr之间共享,并且具有另一个引用计数器,以使其保持活动,直到最后一次引用它被释放.

当重新分配一个shared_ptr时,它指向另一个控制块,这样控制块只会指向一个相同的对象.换句话说,在控制块中没有替换另一个对象.

总结

以上是内存溢出为你收集整理的c – weak_ptr如何知道共享资源已经过期?全部内容,希望文章能够帮你解决c – weak_ptr如何知道共享资源已经过期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1250282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存