狗尾续貂:利用引用计数在多线程中安全释放资源

原创 2006年05月21日 15:52:00
原文标题:IOCP中的socket错误和资源释放处理方法
原文作者:sodme
原文地址:http://blog.csdn.net/sodme/archive/2006/04/17/666062.aspx
原作者声明:本文可以不经作者同意任意转载、复制、传播,但任何对本文的引用均须保留本文的作者、出处及本行声明信息!谢谢!
本文是观大宝SODME的BLOG中文章有感,原文中提到了两种方法(对数据缓冲区使用引用计数机制、在clientsock的对象设计机制上使释放操作线性化),但只讨论了第2种方法的实现。其实在多线程程序里,要让一个释放操作线性化,并不是一件容易的事情,这不仅仅是多个IOCP工作线程的问题(一般来说,我们会为每个CPU设立两个IOCP工作线程),还涉及到其他业务逻辑线程的问题。
比方说,我们通常(就象文中也提到的)会将ClientSocket与接收缓冲区绑定到一个会话对象中(为简化起见,发送数据往往没有用overlapped机制,而是直接用一个异步send,也就不需要发送缓冲区),而这个对象可能被除IOCP工作线程以外的其他线程也用到,比方说一个事件队列的处理线程(我们会在收到数据的时候生成事件对象置入队例中,以类似于Command模式的方法来处理,而这些事件对象会引用到会话对象),或者,也许有某个容器会存放这些会话对象的一个引用,用于定时发送心跳包、会话计数、检索等等,这个时候,会话对象的销毁就不是那么简单的了,换句话说,仅靠“将销毁工作统一到执行GetQueuedCompletionStatus的函数里“是不够的。
在这种情况下,文中提到的第1种“采用引用计数”的方法就比较优雅了,在我的很多实际应用中,都是将会话对象设计为“可引用计数”的,不暴露它的析构函数,而是当引用计数减到0的时候,自动销毁,这样就保证“仅当没有任何人使用它的时候才会释放它”。
利用C++的模板,可以十分方便地模拟出自动引用计数的安全指针:
 



_REFCOUNTED_INCLUDED_
_REFCOUNTED_INCLUDED_


_MT



RefCountable


_MT
refCount_

refCount_




r
_MT
refCount_

refCount_

r
r

r


refCount_



refCount_


_MT




refCount_
RefCountable
RefCountable RefCountable


T
RefCountedPtr


T ptr ptr
ptr_
ptr_

RefCountedPtrT sour sourptr_
ptr_
ptr_

RefCountedPtr RefCountedPtrT right
right
ptr_
ptr_
ptr_ rightptr_
ptr_
ptr_




ptr_
ptr_


T ptr_
T

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_

RefCountedPtrT left RefCountedPtrT right
leftptr_ rightptr_


ptr_
ptr_


T ptr_


T ptr
ptr
ptr
ptr_
ptr_
ptr_ ptr



T ptr_


多线程引用计数问题(避免坑爹)

你没有注意到细节 -多线程引用计数问题          其实写这篇文章完全是偶然所得,桌面安全有一套比较严格的测试平台,整个这套测试平台是建立的Appverifer的基础之上。而且,这套测试平台...
  • gyb999
  • gyb999
  • 2012年06月27日 16:18
  • 1393

网络攻击技术(三)——Denial Of Service

DOS攻击。。貌似很厉害。虽然不是很懂,但是要记录下来。不忘研究
  • qq_19674905
  • qq_19674905
  • 2016年12月08日 22:42
  • 127

Java线程安全的计数器

一、多线程以及线程安全           java线程安全就是指控制多个线程对某个资源的有序访问或修改。这涉及两个很重要的概念:java的内存模型和java的线程同步机制。       1.java...
  • Yolanda_NuoNuo
  • Yolanda_NuoNuo
  • 2014年08月27日 10:04
  • 7891

OC学习篇之---数组对象的引用计数问题和自动释放池的概念

之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用:http://blog.csdn.net/jiangwei0910410003/article/det...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月14日 17:04
  • 8094

多线程计数器——原子操作

众所周知,多线程下计数存在着计数不正确的问题。这个问题的根源在于多个线程对同一个变量可以同时访问(修改)。这样就造成了修改后的结果不一致。          首先在这里先强调一点,volatile ...
  • tangliguantou
  • tangliguantou
  • 2014年09月28日 17:33
  • 2853

cocos2dx的Http请求与zip文件多线程解压

cocos2dx的文件下载与zip文件的解压写入本地 以下代码仅供参考,毕竟我也是误打误撞,注释可以选择不看,可能误人子弟 文件下载肯定非常简单对吧,直接一个Http请求,完事,响应回调里面写入本...
  • qq_37026189
  • qq_37026189
  • 2017年12月13日 23:40
  • 97

什么是线程安全

线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。产生线程不安全的原因在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资...
  • suifeng3051
  • suifeng3051
  • 2016年08月09日 17:20
  • 2935

一种多线程基于计数无锁实现(C#)(转载)

转自:http://blog.csdn.net/chzuping/article/details/10960061   chzuping的专栏 chzuping的专栏 本文介绍一种不加锁,不使用...
  • bodybo
  • bodybo
  • 2015年12月21日 10:03
  • 1274

cocos-js,内存管理1---引用计数方式

一.开篇引题在理解cocos2dx的内存管理机制之前,我们可以先了解下c++中变量的内存空间的分配问题. 我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对...
  • wade333777
  • wade333777
  • 2016年06月30日 11:26
  • 1067

C++ 引用计数

C++没有像java那样的垃圾回收机制,但是我们可以实现一个。一种很简单的方式就是使用引用计数。它实际上是一种用对象来管理资源的方式,因为普通的栈上的对象在离开作用域时会调用对应的析构函数,根据这个特...
  • u012501459
  • u012501459
  • 2015年10月21日 11:04
  • 1346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:狗尾续貂:利用引用计数在多线程中安全释放资源
举报原因:
原因补充:

(最多只允许输入30个字)