博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(8)引用计数的智能指针shared_ptr之一
阅读量:4162 次
发布时间:2019-05-26

本文共 1251 字,大约阅读时间需要 4 分钟。

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

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

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

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

// boost_004.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include 
#include
#include
//使用shared_ptrvoid TestSharedPtr(void){ //一般指针操作 boost::shared_ptr< int > pFirst(new int); *pFirst = 100; std::cout << *pFirst << std::endl; pFirst.reset(new int);}

转载地址:http://naixi.baihongyu.com/

你可能感兴趣的文章
MapBalanceReduce介绍
查看>>
left join 和 left outer join
查看>>
文字式网页浏览器w3m (默认快捷键列表)
查看>>
MySQL去除查询结果重复值 distinct 的用法
查看>>
sql聚合函数
查看>>
用Python来写MapReduce的实际应用程序
查看>>
Java正则表达式详解
查看>>
NASA放弃Eucalyptus 转向Nebula云平台
查看>>
使用 RRDtool 揭示 Web 性能问题
查看>>
对RRDTool的总结(一)
查看>>
对RRDTool的总结(二)
查看>>
High Availability for the Ubuntu Enterprise Cloud (UEC) – Cloud Controller (CLC)
查看>>
UbuntuHighAvailabilityTeam
查看>>
Linux下php 环境搭建
查看>>
linux下安装和运行wireshark
查看>>
PHP中时间和日期函数总结
查看>>
PHP中全局变量$_SERVER的详细用法
查看>>
php替换字符串函数strtr()和str_repalce()区别
查看>>
PHP 操作 MYSQL 创建数据库,表,字段
查看>>
最常用的PHP正则表达式收集整理
查看>>