#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
std::mutex mtx;
class Test
{
public:
static Test* instance()
{
if (_ins == nullptr)
{
mtx.lock();
/*
第二次检查是必要的,因为两个线程可以同时进前面的if判断。
lock只是限制某一个时刻只有一个线程访问这段代码,第一个线程访问完之后,
如果不判断空,另一个线程还是会再次生成Test的实例。
*/
if (_ins == nullptr)
{
_ins = new Test;
}
else
{
/*
这个else会进入一次
*/
cout << "aaaa " << endl;
}
mtx.unlock();
}
return _ins;
}
private:
Test() { cout << "AAAAAAA" << endl; }
static Test * _ins;
};
Test* Test::_ins;
void foo()
{
for (int i = 0; i < 1000000; i++)
{
Test::instance();
}
}
void main()
{
thread t(foo);
thread t2(foo);
t2.join();
t.join();
while (true);
}
C++ 单实例模式 线程安全
最新推荐文章于 2022-06-12 21:34:05 发布