简单的模拟多线程引用计数原理

转载 2015年07月07日 20:35:42

大家都知道多线程编程学习中有一个很重要的东西——引用计数,一个线程的生或死或运行状态都跟这个计数有关,他同样是在适当的时候加加减减的。这篇文章的目的就是模拟下简单的引用计数,原因是因为项目中GateServer莫名宕机,而且运维没有给过来宕机详细信息中的偏移地址,所以纵然我们又cod文件也没法查找问题所在,所以就想出了这样一个笨办法,在每个函数都加上调用计数,这样超过一定次数的我们就认为它可能是死递归,从而方便确定问题。下面给出一个简单的引用计数类的代码。(没有写成模板,因为模板的理解成本有点高,所以在项目中不太使用)
[cpp]
/************************************************************************

FileName:AutoRefCount.h
Author :eliteYang
URL :http://www.cppfans.org
Desc :引用计数

************************************************************************/

#ifndef __AUTO_REF_COUNT_H__
#define __AUTO_REF_COUNT_H__

#pragma once

class RefCount
{
public:

RefCount() : _refCount( 0 ){}
~RefCount(){}

void AddRefCount(){ ++_refCount; }
void DecRefCount()
{
–_refCount;

if ( _refCount < 0 )
{ _refCount = 0; }
}

int GetRefCount(){ return _refCount; }

private:
int _refCount;
};

class PtrRefCount
{
public:
PtrRefCount( RefCount* pRef, int nValue = 100 ) : pRefCount( pRef ), nCount( nValue )
{
if ( NULL != pRefCount )
{
pRefCount->AddRefCount();
}
}

~PtrRefCount()
{
if ( NULL != pRefCount )
{
pRefCount->DecRefCount();
}
}

bool CheckCount( char* szFunction )
{
if ( NULL == pRefCount )
{ return false; }

if ( pRefCount->GetRefCount() > nCount )
{
std::cout << "Function " << szFunction << " call error, maybe dead recursion, please check the code" << std::endl;
return false;
}

return true;
}

private:
RefCount* pRefCount;
const int nCount;
};

#endif
[/cpp]

下载我们写一个例子来测试下,我们故意写一个死递归来检验代码。如下:
[cpp]
#include "AutoRefCount.h"
#include <iostream>

#define __FUNCTION_CALL_COUNT__ RefCount _ref; \
PtrRefCount ptrRef( &_ref ); \
ptrRef.CheckCount( __FUNCTION__ );

void function()
{
__FUNCTION_CALL_COUNT__;
function();
}

int _tmain(int argc, _TCHAR* argv[])
{
function();
return 0;
}
[/cpp]

结果我们发现打出了该函数可能死递归的Log,这样我们就方便查找问题了。希望对你有用!

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

原文标题:IOCP中的socket错误和资源释放处理方法 原文作者:sodme原文地址:http://blog.csdn.net/sodme/archive/2006/04/17/666062.as...
  • SeaWave
  • SeaWave
  • 2006年05月21日 15:52
  • 5968

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

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

垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的

先简单说说Java运行时内存区,划分为线程私有区和线程共享区 (1)线程私有区:   1、 程序计数器,记录正在执行的虚拟机字节码的地址;   2、拟机栈:方法执行的内存区,每个方法执行时会在虚拟机...
  • yclfdn2004
  • yclfdn2004
  • 2016年08月26日 15:23
  • 308

C++简单实现对象引用计数示例

C++简单实现对象引用计数示例 #include #include using namespace std; class String { public: String(const char...
  • chinawangfei
  • chinawangfei
  • 2016年02月17日 15:16
  • 1423

cocos2d-x中的引用计数原理

本文基于3.2版本,适用于3.0及其以上版本,2.X版本可能是使用不同的方式进行处理,本文未对比2.X版本的源代码。首先看一下cocos2d-x中对象的继承体系:                  ...
  • realxie
  • realxie
  • 2016年04月03日 22:30
  • 1604

《Objective-C高级编程:引用计数和strong ,weak

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/17694129 转载请注明出处 如果觉得文章对你有所帮...
  • u012588310
  • u012588310
  • 2014年09月11日 17:57
  • 1322

Linux内核引用计数

众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异常。现代的C/C++类库一般会提供智能指针来作为内存管理的折中方案,...
  • all8023
  • all8023
  • 2013年11月07日 15:16
  • 1334

ARC 下引用计数的打印

在管理内存的时候经常需要打印对象的引用计数,来检测对象是否发生内存泄漏的情况...
  • yishabeier152
  • yishabeier152
  • 2016年09月03日 11:21
  • 614

C++ 引用计数

C++没有像java那样的垃圾回收机制,但是我们可以实现一个。一种很简单的方式就是使用引用计数。它实际上是一种用对象来管理资源的方式,因为普通的栈上的对象在离开作用域时会调用对应的析构函数,根据这个特...
  • u012501459
  • u012501459
  • 2015年10月21日 11:04
  • 1353

【知识点】垃圾回收之引用计数之循环引用

原文地址关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, ...
  • jiasike
  • jiasike
  • 2016年05月09日 20:07
  • 3062
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的模拟多线程引用计数原理
举报原因:
原因补充:

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