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

转载 2015年07月07日 21:11:08

大家都知道多线程编程学习中有一个很重要的东西——引用计数,一个线程的生或死或运行状态都跟这个计数有关,他同样是在适当的时候加加减减的。这篇文章的目的就是模拟下简单的引用计数,原因是因为项目中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,这样我们就方便查找问题了。希望对你有用!

《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数

第一章:自动引用计数 一、什么是自动引用计数 二、内存管理/引用计数 1、概要 2、内存管理的思考方式 3、alloc/retain/release/dealloc实现 4、苹果的实现 5、aut...

ATL学习笔记(1):ATL单线程与多线程套间对象引用计数的基础实现

COM对象必须在套间中运行。套间分为单线程套间和多线程套间。在单线程套间中,套间保证COM对象实例仅有一个线程可以访问,而在多线程套间中,COM对象实例可同时被多个线程访问。因此,在多线程套间中执行的...

cocos2dx 3.x 源码阅读之一 引用计数原理

之前看过很多的文章,都是讲解的引用计数的

Swift 引用计数总结 Strong,Weak, unowned 简单使用

每天一小结,必须读几篇博客在闲暇时,下面开始进入正题: ARC ARC 苹果版本的自动内存管理的编译时间特性。它代表了自动引用计数(Automatic Reference Counting...

C++ 引用计数技术及智能指针的简单实现及改进

转载这篇文章点击打开链接 C++ 引用计数技术及智能指针的简单实现 阅读目录 1.智能指针是什么2.普通指针存在的问题3.什么是引用计数4.智能指针实现 ...

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

C++简单实现对象引用计数示例 #include #include using namespace std; class String { public: String(const char...

OC 内存管理 --- 引用计数简单使用

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------  为什么程序设计要进行内存管理 1, 移动设备的内存,一般都极其有限, 所以每个APP能够分得...

cocos2d-x中的引用计数原理

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

[笔记]Java虚拟机垃圾回收的原理是“引用计数”吗?

迷茫时,能遇见一本好书,并且能够静下心把它读完,那真的是一件愉快和值得纪念的事。   2017年2月7日-2017年3月16日,读完《深入理解Java虚拟机》第2版(周志明著)。接下来这几篇,我将会把...
  • chwnpp2
  • chwnpp2
  • 2017年03月16日 16:32
  • 547

智能指针的实现--使用引用计数实现以及原理

一、智能指针   在C++语言编程时,当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的模拟多线程引用计数原理
举报原因:
原因补充:

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