多线程下的C++ 单例模式
2012-06-23 20:16
274 查看
c++ 实现多线程安全下的单例模式
多线程环境下的输出日志到标准输出
首先我们需要一个锁类能够自动初始化,并且降低耦合。
/*
* lock.h
* created on :2012-06-23
*/
#ifndef LOCK_H
#define LOCK_H
class locker
{
public:
inline locker( ) //构造函数
{
pthread_mutex_init(&mutex,NULL);
}
inline ~locker( ) //析构函数
{
pthread_mutex_destroy(&mutex);
}
public:
inline lock( )
{
pthread_mutex_lock(&mutex);
}
inline unlock()
{
pthread_mutex_unlock(&mutex);
}
private:
pthread_mutex_t mutex;
};
#endif /*LOCK_H*/
其次,声明日志类,重点是将构造函数,拷贝构造函数,重载的赋值操作符私有化,将函数成员和数据成员声明为静态,添加实例指针和全局访问点。
/*
* log.h
* created on:2012-06-23
*/
#include "locker.h"
class tinylog
{
public:
static tinylog * getInstance();
static void WriteLog(const char *format,......);
private:
tinylog (); //构造函数
tinylog(const tinylog &); //拷贝构造函数
tinylog & operator = (const tinylog &); //重载的赋值操作符函数
static tinylog * log;
static locker llock;
private:
class CGarbo //它的唯一工作是在析构函数中删除类tinylog的实例。
{
public:
inline ~CGarbo( )
{
if(tinylog::log)
{
delete tinylog::log;
}
}
}
static CGarbo Garbo; //定义的静态成员,在程序结束时,系统会调用它的析构函数.
}
然后是日志类的实现,注意全局访问点中使用double check提高性能。
/*
* log.cpp
[b] * created on:2012-06-23
*/
#include "log.h"
tinylog * tinylog::log = NULL;
tinylog tinylog::llock;
tinylog::tinylog( )
{
..................
}
tinylog::tinylog(const tinylog & tg)
{
.............
}
tinylog & tinylog::operator = (const tinylog & tg)
{
.....................
}
tinylog * tinylog::getInstance( )
{
if(log == NULL)
{
llock.lock();
if(log == NULL)
{
log = new tinylog();
}
llock.unlock();
}
return log;
}
void tinylog::WriteLog(const char * format,....)
{
va_list args;
va_start(args,format);
llock.lock();
vfprintf(stdout,FORMAT,args);
llock.unlock();
va_end(args);
}
多线程环境下的输出日志到标准输出
首先我们需要一个锁类能够自动初始化,并且降低耦合。
/*
* lock.h
* created on :2012-06-23
*/
#ifndef LOCK_H
#define LOCK_H
class locker
{
public:
inline locker( ) //构造函数
{
pthread_mutex_init(&mutex,NULL);
}
inline ~locker( ) //析构函数
{
pthread_mutex_destroy(&mutex);
}
public:
inline lock( )
{
pthread_mutex_lock(&mutex);
}
inline unlock()
{
pthread_mutex_unlock(&mutex);
}
private:
pthread_mutex_t mutex;
};
#endif /*LOCK_H*/
其次,声明日志类,重点是将构造函数,拷贝构造函数,重载的赋值操作符私有化,将函数成员和数据成员声明为静态,添加实例指针和全局访问点。
/*
* log.h
* created on:2012-06-23
*/
#include "locker.h"
class tinylog
{
public:
static tinylog * getInstance();
static void WriteLog(const char *format,......);
private:
tinylog (); //构造函数
tinylog(const tinylog &); //拷贝构造函数
tinylog & operator = (const tinylog &); //重载的赋值操作符函数
static tinylog * log;
static locker llock;
private:
class CGarbo //它的唯一工作是在析构函数中删除类tinylog的实例。
{
public:
inline ~CGarbo( )
{
if(tinylog::log)
{
delete tinylog::log;
}
}
}
static CGarbo Garbo; //定义的静态成员,在程序结束时,系统会调用它的析构函数.
}
然后是日志类的实现,注意全局访问点中使用double check提高性能。
/*
* log.cpp
[b] * created on:2012-06-23
*/
#include "log.h"
tinylog * tinylog::log = NULL;
tinylog tinylog::llock;
tinylog::tinylog( )
{
..................
}
tinylog::tinylog(const tinylog & tg)
{
.............
}
tinylog & tinylog::operator = (const tinylog & tg)
{
.....................
}
tinylog * tinylog::getInstance( )
{
if(log == NULL)
{
llock.lock();
if(log == NULL)
{
log = new tinylog();
}
llock.unlock();
}
return log;
}
void tinylog::WriteLog(const char * format,....)
{
va_list args;
va_start(args,format);
llock.lock();
vfprintf(stdout,FORMAT,args);
llock.unlock();
va_end(args);
}
相关文章推荐
- C++实现多线程安全的单例模式 已测试
- C++实现多线程安全的单例模式
- C++模式设计-多线程下的单例模式
- c++ 单例模式多线程竞态条件
- c++工厂模式和多线程结合
- c++多线程单例模式实现
- 单例模式的多线程安全支持(C++)
- C++单例模式 终极解决方案 多线程
- 通过例子学设计模式之--单例模式以及多线程下说明(C++实现)
- C++ 多线程下的单例模式
- C++实现多线程安全的单体模式(Singleton)
- C++ 实现单例模式 多线程
- [置顶] C++单例模式:单例模式遇到多线程
- 【转】单例模式 C++实现 多线程安全
- C++单例模式 标签: c++null设计模式多线程delete数据库 2010-07-29 10:08 10889人阅读 评论(3) 收藏 举报 分类: 设计模式(1) C/C++(43)
- C++实现多线程安全的单例模式
- 单例模式的c++实现
- C++ 设计模式中的is-a/has-a/like-a/use-a模式
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
- android 多线程断点下载,listview 模式 开始 暂停等功能