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

转载 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,这样我们就方便查找问题了。希望对你有用!

相关文章推荐

OpenGL ES之glUniform函数

函数名: glUniform 功能: 为当前程序对象指定Uniform变量的值。(译者注:注意,由于OpenGL ES由C语言编写,但是C语言不支持函数的重载,所以会有很多名字相同后...

Android LayoutInflater原理分析,带你一步步深入了解View(一)

有不少朋友跟我反应,都希望我可以写一篇关于View的文章,讲一讲View的工作原理以及自定义View的方法。没错,承诺过的文章我是一定要兑现的,而且在View这个话题上我还准备多写几篇,尽量能将这个知...

Qt 3D教程(一)使用Qt Widgets建立一个框架

Qt 3D是Qt 5.5发布时最重要的一个新模块,它很好地将3D的繁文缛节封装在底层,留给我们的是简洁的对象创建方法,它也不需要你掌握太多的着色器知识,只需要懂得一些三维和光照的基本知识就可以创建出比...

OpenCV&OpenCL宏观预览

撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/51745250本文来自 【jscese】的博客!概念OpenCV :Open Sou...
  • jscese
  • jscese
  • 2016-06-28 16:04
  • 1841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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