
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
class singleClass
{
private:
singleClass() {}; //私有化构造函数
static singleClass* m_instance; //静态成员变量
public:
static singleClass* GetInstance()
{
if (m_instance == NULL)
{
m_instance = new singleClass();
static GuiderPtr gc;
}
return m_instance;
}
class GuiderPtr //类中套类,用来释放对象
{
public:
~GuiderPtr()
{
if (singleClass::m_instance)
{
delete singleClass::m_instance;
singleClass::m_instance = NULL;
}
}
};
void func() {
cout << "This is a Test" << endl;
}
};
//类静态变量初始化
singleClass* singleClass::m_instance = NULL;
int main()
{
singleClass* sg_ptr = singleClass::GetInstance(); //创建一个singleClass类,并返回指针
singleClass* sg_ptr1 = singleClass::GetInstance(); //返回的之前创建的指针
sg_ptr->func();
sg_ptr1->func();
singleClass::GetInstance()->func();
return 0;
}
考虑加锁方式
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std;
std::mutex res_mutex;
class singleClass
{
private:
singleClass() {}; //私有化构造函数
static singleClass* m_instance; //静态成员变量
public:
static singleClass* GetInstance()
{
//提过效率
//a) 如果if (m_instance != nullptr) 条件成立,则肯定表示 m_instance 已经被new过了
//b) 如果if (m_instance == nullptr) 不代表m_instance一定没被new过
if (m_instance == NULL) //双重锁定(双重检查)
{
std::unique_lock<std::mutex> mutex_getInstance(res_mutex); //自动加锁
if (m_instance == NULL)
{
m_instance = new singleClass();
static GuiderPtr gc;
}
}
return m_instance;
}
class GuiderPtr //类中套类,用来释放对象
{
public:
~GuiderPtr()
{
if (singleClass::m_instance)
{
delete singleClass::m_instance;
singleClass::m_instance = NULL;
}
}
};
void func() {
cout << "This is a Test" << endl;
}
};
//类静态变量初始化
singleClass* singleClass::m_instance = NULL;
//线程入口函数
void mythread() {
cout << "线程函数开始执行了" << endl;
singleClass* sgPtr = singleClass::GetInstance(); //这里可能有问题
sgPtr->func();
cout << "线程函数执行完毕了" << endl;
return;
}
int main()
{
std::thread t_obj1(mythread);
std::thread t_obj2(mythread);
t_obj2.join();
t_obj1.join();
return 0;
}
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
std::mutex res_mutex;
std::once_flag g_flag; //全局变量,定义的标记
class singleClass
{
private:
singleClass() {}; //私有化构造函数
static singleClass* m_instance; //静态成员变量
static void CreatInstance() //只被调用一次
{
std::chrono::milliseconds dura(2000);
std::this_thread::sleep_for(dura);
cout << "CreatInstance()执行了" << endl;
m_instance = new singleClass();
static GuiderPtr gc;
}
public:
static singleClass* GetInstance()
{
//两个线程同时执行到这里,其中一个线程要等另外一个线程执行完毕CreateInstance();
std::call_once(g_flag, CreatInstance);
cout << "GetInstance()执行了" << endl;
return m_instance;
}
class GuiderPtr //类中套类,用来释放对象
{
public:
~GuiderPtr()
{
if (singleClass::m_instance)
{
delete singleClass::m_instance;
singleClass::m_instance = NULL;
}
}
};
void func() {
cout << "This is a Test" << endl;
}
};
//类静态变量初始化
singleClass* singleClass::m_instance = NULL;
//线程入口函数
void mythread() {
cout << "线程函数开始执行了" << endl;
singleClass* sgPtr = singleClass::GetInstance(); //这里可能有问题
sgPtr->func();
cout << "线程函数执行完毕了" << endl;
return;
}
int main()
{
std::thread t_obj1(mythread);
std::thread t_obj2(mythread);
t_obj2.join();
t_obj1.join();
return 0;
}