单例设计模式就是一个类只能实例化出一个对象,不能实例化出多个对象,单例模式分为两种,一种是饿汉单例模式,是指在类创建的时候就已经实例化出了一个对象,好处是这个模式没有线程安全问题,坏处是浪费资源,不管之后有没有用到,都会先实例化一个对象,代码如下:
std::mutex mlock;
class Solution {
private:
Solution() {}
static Solution* ptr;
public:
static Solution* Create() {
return ptr;
}
};
Solution* Solution::ptr = new Solution();
还有一种是懒汉模式,顾名思义,当你需要用它的时候才去实例化对象,如果多个线程同时去实例化对象,那么产生的对象可能不唯一,所以存在线程安全的问题,避免这个线程安全的解决办法是用双检查锁(double checked locking),不是很难理解,具体实现过程就不在讲解,直接看代码吧:
#include <iostream>
#include <mutex>
std::mutex mlock;
class Solution {
public:
static Solution* Create() {
if (ptr == NULL) {
std::unique_lock<std::mutex> MyUniqueLock(mlock);
if (ptr == NULL) {
ptr = new Solution();
static Destructor s;
}
}
return ptr;
}
class Destructor {
public:
~Destructor() {
if (Solution::ptr != NULL) {
delete Solution::ptr;
Solution::ptr = NULL;
}
}
};
private:
static Solution* ptr;
Solution() {};
};
Solution *(Solution::ptr) = NULL;
void Thread() {
Solution* tmp = Solution::Create();
std::cout << "My Thread Function" << std::endl;
}
int main()
{
std::thread t1(Thread);
std::thread t2(Thread);
t1.join();
t2.join();
return 0;
}