利用c++11实现线程安全的单例类
2018-03-05 16:39
274 查看
工作中单例类比较常见,主要是为了防止频繁地创建和销毁某个对象。下文是利用C++11的多线程库编写了一个线程安全的singleton类,类的描述为:(1) 懒汉式单例类: 即使用的时候才创建;
(2) 加双重判断:第一个判断是为了防止频繁地加锁和解锁,第二个判断是为了保证实例只创建一次;
(3)利用unique_lock的局部特性,防止忘记解锁而导致死锁问题;#include <thread>
#include <mutex>
#include <iostream>
class Singleton {
public:
static Singleton* get_instance() {
if (m_instance == nullptr) {
std::unique_lock<std::mutex> lck (m_mutex);
if (m_instance == nullptr) {
std::cout << "new Singleton called" << std::endl;
m_instance = new Singleton;
}
}
return m_instance;
}
void hello() {
std::cout << "hello, are you ok?" << std::endl;
}
private:
static std::mutex m_mutex;
static Singleton * m_instance;
Singleton(){};
~Singleton(){};
Singleton(const Singleton&){};
Singleton& operator = (const Singleton&);
};
Singleton* Singleton::m_instance = nullptr;
std::mutex Singleton::m_mutex;
void hello1() {
Singleton* pt = Singleton::get_instance();
pt->hello();
}
void hello2() {
Singleton* pt = Singleton::get_instance();
pt->hello();
}
int main(int argc, char* argv[]) {
Singleton* pt_s = Singleton::get_instance();
std::thread t1(hello1);
std::thread t2(hello2);
t1.join();
t2.join();
return 0;
}
输出如下:
new Singleton called
hello, are you ok?
hello, are you ok?
相关文章推荐
- 利用C++11实现一个自动注册的工厂
- C++11 使用 unique_lock,lock_guard,condition_variable, lambda表达式实现线程安全队列
- c++11 线程安全的队列实现
- (转)利用CAS算法实现通用线程安全状态机
- 用C++实现单例模式3——如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton
- 利用条件变量实现线程安全队列
- 利用C++11原子量如何实现自旋锁详解
- C++11 线程安全的BlockingQueue实现
- 利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数
- 利用boost::mutex实现线程安全列表模板类,附源码及使用例子
- 利用C++11实现一个自动注册的工厂
- 利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数
- 利用C++11实现一个自动注册的工厂
- 【c++11 新特性应用】利用bind实现通用的混合任务线程池
- 如何利用c++11的新特性编写类成员线程函数并实现同步
- 如何利用内部类的类型封装功能实现线程安全的类以提高程序的性能
- 利用C++11实现一个自动注册的工厂
- c++11 利用智能指针实现自动资源管理
- 利用双重检查加锁机制实现线程安全的单例模式
- 利用原子操作实现线程安全的集合