boost库在工作引用计数的智能指针shared_ptr之一
在前面已经介绍了三个智能指针,它们都是适合在局部作用域,不进行拷贝的情况下使用,最为合适,如果使用到其它情况,使用的好处跟坏处一样多,这种情况就不宜使用了。在目前多核处理器流行的今天,并发处理已经成为常事,因为多线程运行的高效性,界面操作人性化方面,都需要并发性处理。比如界面需要一直响应用户的操作,但后台的任务又需要有序地进行,只能阻塞在那里。这时,如果使用单线程,就显然人机操作界面不好了。在采用多线程编程的情况之下,经常会有这种需求,比如当从界面线程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 <memory.h>
#include <iostream>
#include <boost/shared_ptr.hpp>
//使用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);
}
补充:软件开发 , C++ ,