C++单例模式实现之一
单例模式的实现有多种,其他实现可参考相关书箱或网络上的文章。
方式一
含四个文件,mymutex.h singleton.h singleton.cpp main.cpp
mymutex.h文件
#ifndef _MY_MUTEX_H_
#define _MY_MUTEX_H_
#include <pthread.h>
class MyMutex
{
public:
MyMutex()
{
pthread_mutex_init(&mutex, 0);
pthread_mutex_lock(&mutex);
}
~MyMutex()
{
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
private:
pthread_mutex_t mutex;
};
#endif // _MY_MUTEX_H_
singleton.h文件,此例中仅将构造函数设置为私有。
#ifndef _MY_SINGLETON_H_
#define _MY_SINGLETON_H_
class Singleton
{
public:
static Singleton * instance();
void foo(const char * str);
private:
Singleton() {}
private:
static Singleton * obj;
};
#endif // _MY_SINGLETON_H_
singleton.cpp文件
#include <iostream>
#include "singleton.h"
#include "mymutex.h"
Singleton * Singleton::obj = 0;
Singleton * Singleton::instance()
{
if (0 == obj)
{
MyMutex mutex;
if (0 == obj)
{
obj = new Singleton;
}
}
return obj;
}
void Singleton::foo(const char * str)
{
if (0 != str)
{
std::cout << str << std::endl;
}
}
方式二
含三个文件 singleton.h(内容同方式一) singleton.cpp main.cpp
singleton.cpp文件
#include <iostream>
#include "singleton.h"
Singleton * Singleton::obj = new Singleton;
Singleton * Singleton::instance()
{
return obj;
}
void Singleton::foo(const char * str)
{
if (0 != str)
{
std::cout << str << std::endl;
}
}
测试
main.cpp 测试文件
#include <pthread.h>
#include "singleton.h"
void * thread(void * arg)
{
Singleton::instance()->foo((char *)arg);
}
int main()
{
int cnt = 3;
pthread_t tid1, tid2, tid3;
while (cnt--)
{
pthread_create(&tid1, 0, thread, (void *)"thread 1 ...");
pthread_create(&tid2, 0, thread, (void *)"thread 2 ...");
pthread_create(&tid3, 0, thread, (void *)"thread 3 ...");
pthread_join(tid1, 0);
pthread_join(tid2, 0);
pthread_join(tid3, 0);
}
return 0;
}
运行结果