单件模式(Singleton)的目标是在应用程序中创建一个唯一的对象。
比较典型的例子就是Windows下的任务管理器。
单件模式的类图比较简单,如下:
下面实现一个多线程下的单件模式,代码如下:
//TaskManager.h
#include "afxmt.h"
class TaskManager
{
public:
static TaskManager* Instence();
private:
TaskManager();
virtual ~TaskManager();
static TaskManager* ms_instence;
static CCriticalSection ms_cs;
};
//TaskManager.cpp
#include "stdafx.h"
#include "TaskManager.h"
#include <iostream>
using namespace std;
TaskManager* TaskManager::ms_instence = 0;
CCriticalSection TaskManager::ms_cs;
TaskManager::TaskManager()
{
cout << "启动任务管理器" << endl;
}
TaskManager::~TaskManager()
{
if(ms_instence != 0)
{
delete ms_instence;
ms_instence = 0;
}
}
TaskManager* TaskManager::Instence()
{
ms_cs.Lock();
if(ms_instence == 0)
{
ms_instence = new TaskManager;
}
else
{
cout << "任务管理器已启动" << endl;
}
ms_cs.Unlock();
return ms_instence;
}
//main.cpp
#include "stdafx.h"
#include "TaskManager.h"
#include <windows.h>
#include <process.h>
static DWORD WINAPI CreateThreadFun(LPVOID pParam)
{
TaskManager* manager = TaskManager::Instence();
TaskManager* manager1 = TaskManager::Instence();
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hHandle;
DWORD dwThreadId;
hHandle = CreateThread(NULL, 0, CreateThreadFun, LPVOID(0), NULL, &dwThreadId);
TaskManager* manager = TaskManager::Instence();
TaskManager* manager1 = TaskManager::Instence();
Sleep(2000);
CloseHandle(hHandle);
return 0;
}
运行上面代码需在VC++6中设置:
1、工程-设置-C/C++中,分类栏选择“Code Generation”,User run-time library:下选择Debug Multithreaded
2、工程-设置-连接中,分类栏选择“输入”,忽略库中输入Nafxcwd.lib,并在对象/库模块栏最前面加上Nafxcwd.lib
运行后可以看到,多线程只生成了一个实例。
运行结果为:
启动任务管理器
任务管理器已启动
任务管理器已启动
任务管理器已启动