鱼C论坛

 找回密码
 立即注册
查看: 2576|回复: 1

[技术交流] 引用计数的智能指针shared_ptr

[复制链接]
发表于 2013-9-1 02:07:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

 在前面已经介绍了三个智能指针,它们都是适合在局部作用域,不进行拷贝的情况下使用,最为合适,如果使用到其它情况,使用的好处跟坏处一样多,这种情况就不宜使用了。在目前多核处理器流行的今天,并发处理已经成为常事,因为多线程运行的高效性,界面操作人性化方面,都需要并发性处理。比如界面需要一直响应用户的操作,但后台的任务又需要有序地进行,只能阻塞在那里。这时,如果使用单线程,就显然人机操作界面不好了。在采用多线程编程的情况之下,经常会有这种需求,比如当从界面线程T创建一个对象A,然后线程T1和线程T2使用,但又想这个对象A不在界面线程T里删除,而由线程T1或T2来删除。也就是说当线程T1和T2都不再使用时就需要及时删除对象A。在这种情况之下,很难知道让线程T1来删除,还是让线程T2来删除。因为线程是处理器调度时的最小单位,每个线程运行多长时间,多少行代码是不确定的。那么有什么办法可以让线程T1和线程T2都不使用对象A时,就立即删除呢?当然可以使用线程互斥对象来相互通知是可以达到的,但还有没有更简单的方法呢?很久以前,人们就发现使用对象引用计数技术,就可以达到开销更小,又可以在对象不使用时及时删除对象,释放资源出来。使用引用计数时,只需要多核心处理器在运行一条指令处阻塞,而其它时间就可以并发地执行指令,从而达到多核心处理器最大化地并发运行。

  对象引用计数的技术,在使用方面又存在两种方式,一种方式是创建一个基类,在基类里实现引用计数的操作,这样在派生类里就可以引用计数的保存和操作了。另外一种方式是引入第三个类,一个是操作对象的类,一个是引用计数的类,一个是把操作对象和引用计数的类组合在一起的类。这两种方式进行比较,继承的方式耦合程度要高一些,而采用组合方式复用性要好一些。因此在boost库里的实现就是采用第二种方式来进行的,这样就可以更适用于多种情况之下。

  在boost库里引入了对象引用计数管理技术的模板类shared_ptr,这个智能指针是重量级的实现,不但可以拷贝,还可以比较指针,是跟原始指针最相似的智能指针。由于这些特性,这个智能指针是可以使用到STL里的容器类里,而不像前面几个智能指针那样,不具备这样的特性。

  智能指针shared_ptr简单的使用如下:

  [cpp]

  // boost_004.cpp : Defines the entry point for the console application.

  //

  #include "stdafx.h"

  #include

  #include

  #include

  //使用shared_ptr

  //软件开发人员: 蔡军生 2013-02-09

  void TestSharedPtr(void)

  {

  //一般指针操作

  boost::shared_ptr< int > pFirst(new int);

  *pFirst = 100;

  std::cout << *pFirst << std::endl;

  pFirst.reset(new int);

  }


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 20:39:14 | 显示全部楼层
想问什么叫引用计数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 00:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表