C++程序员们,快来写简洁的单例模式吧
作者:网络转载 发布时间:[ 2015/1/13 13:51:49 ] 推荐标签:C++ 程序员 net
因此,在有了C++11后我们可以正确的跨平台的实现DCL模式了,代码如下:
1 atomic<Widget*> Widget::pInstance{ nullptr };
2 Widget* Widget::Instance() {
3 if (pInstance == nullptr) {
4 lock_guard<mutex> lock{ mutW };
5 if (pInstance == nullptr) {
6 pInstance = new Widget();
7 }
8 }
9 return pInstance;
10 }
C++11中的atomic类的默认memory_order_seq_cst保证了3、6行代码的正确同步,由于上面的atomic需要一些性能上的损失,因此我们可以写一个优化的版本:
1 atomic<Widget*> Widget::pInstance{ nullptr };
2 Widget* Widget::Instance() {
3 Widget* p = pInstance;
4 if (p == nullptr) {
5 lock_guard<mutex> lock{ mutW };
6 if ((p = pInstance) == nullptr) {
7 pInstance = p = new Widget();
8 }
9 }
10 return p;
11 }
但是,C++委员会考虑到单例模式的广泛应用,所以提供了一个更加方便的组件来完成相同的功能:
1 static unique_ptr<widget> widget::instance;
2 static std::once_flag widget::create;
3 widget& widget::get_instance() {
4 std::call_once(create, [=]{ instance = make_unique<widget>(); });
5 return instance;
6 }
可以看出上面的代码相比较之前的示例代码来说已经相当的简洁了,但是!!!有是但是!!!!在C++memory model中对static local variable,说道:The initialization of such a variable is defined to occur the first time control passes through its declaration; for multiple threads calling the function, this means there’s the potential for a race condition to define first.因此,我们将会得到一份简洁也是效率高的单例模式的C++11实现:
1 widget& widget::get_instance() {
2 static widget instance;
3 return instance;
4 }
用Herb Sutter的话来说这份代码实现是“Best of All”的。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11