本人比较菜,所有是
菜鸟级别的锻炼。。。
直接上代码。。。
头文件:
#pragma once
//
/************************************************************************
单例模式
参考:http://blog.csdn.net/learniting/article/details/8146045
1.考虑如何使入口只有一个:
把构造函数私有化,创建一个静态类型指针,
提供一个公有静态函数NEW初始化该静态指针,
再提供一个销毁函数,把NEW的指针销毁,防止内存泄漏。
2.考虑如何限制拷贝函数,复制函数
把这些函数也私有化,且不用实现该功能。
3.考虑在多线程情况下,会怎么样?
为了适应多线程,必须加锁
注意:
如果在修改类属性操作时,须加锁。否则在多线程情况下会发生意想不到的错误
************************************************************************/
class ILock;
class Singleton
{
private:
static Singleton* instance;
static ILock* plock;
private:
Singleton(void) : nTest(0)
{
}
// 不实现拷贝函数,复制函数
Singleton(const Singleton&);
Singleton& operator =(const Singleton&);
public:
static Singleton* GetInstance();
static void DestoryInstance();
public:
// TEST
int nTest;
int GetTest();
};
.CPP文件
#include "StdAfx.h"
#include <assert.h>
#include "Singleton.h"
#include "BtLock.h"
Singleton* Singleton::instance = NULL;
ILock* Singleton::plock = new CSLock();
Singleton* Singleton::GetInstance()
{
assert(plock);
plock->Lock();
if(NULL == instance){
instance = new Singleton;
}
plock->Unlock();
return instance;
}
void Singleton::DestoryInstance()
{
plock->Lock();
if(NULL != instance){
delete instance;
instance = NULL;
}
plock->Unlock();
}
int Singleton::GetTest()
{
int nret = 0;
plock->Lock();
nret = nTest++;
plock->Unlock();
return nret;
}
MAIN函数,用与测试:
#include "stdafx.h"
#include "Singleton.h"
#include <process.h>
#include <Windows.h>
void _TestThread(void*);
int _tmain(int argc, _TCHAR* argv[])
{
for (int i=0; i<10; i++)
{
_beginthread(_TestThread, NULL, NULL);
}
getchar();
Singleton::DestoryInstance();
return 0;
}
void _TestThread( void* )
{
int ncount = 0;
while(ncount<5){
printf("%d\r\n", Singleton::GetInstance()->GetTest());
Sleep(1000);
ncount++;
}
}