Singleton in C++11 style
#include <iostream>
#include <memory>
#include <mutex> class SingletonOld {
static std::shared_ptr<SingletonOld> handle_;
static std::mutex handle_mutex_; int data_ = 0; public:
static auto create() {
std::lock_guard<std::mutex> lock(handle_mutex_);
if (handle_ == nullptr) {
handle_.reset(new SingletonOld); // Using `make_shared` is error, as `SingletonOld` constructor is private
// to `shared_ptr`, `allocator` and any class else.
// handle_ = std::make_shared<SingletonOld>();
}
return handle_;
} int get_data() { return data_; }
void set_data(int data) { data_ = data; } private:
SingletonOld(const SingletonOld &) = delete;
SingletonOld &operator=(const SingletonOld &) = delete; SingletonOld() {};
}; std::shared_ptr<SingletonOld> SingletonOld::handle_;
std::mutex SingletonOld::handle_mutex_; class Singleton {
int data_ = 0; public:
static Singleton &create() {
// 1. C++11: If control enters the declaration concurrently while the
// variable is being initialized, the concurrent execution shall wait for
// completion of the initialization.
// 2. Lazy evaluation.
static Singleton s; return s;
} int get_data() { return data_; }
void set_data(int data) { data_ = data; } private:
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete; Singleton() {}
}; int main() {
auto p = SingletonOld::create();
std::cout << p->get_data() << std::endl; // 0
p->set_data(1);
auto q = p;
std::cout << q->get_data() << std::endl; // 1 Singleton &s = Singleton::create();
Singleton &r = s;
r.get_data();
std::cout << s.get_data() << std::endl; // 0
s.set_data(1);
std::cout << r.get_data() << std::endl; // 1 return 0;
}
Singleton in C++11 style的更多相关文章
- Google C++ Style Guide在C++11普及后的变化
转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...
- IE10 11的css hack
一.@media -ms-high-contrast @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){ ...
- .NET设计模式(2):单件模式(Singleton Pattern)
转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...
- C++ 11和C++98相比有哪些新特性
此文是如下博文的翻译: https://herbsutter.com/elements-of-modern-c-style/ C++11标准提供了许多有用的新特性.这篇文章特别针对使C++11和C++ ...
- C++11:使用 auto/decltype/result_of使代码可读易维护
C++11 终于加入了自动类型推导.以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用"原生态"的自动类型推导了! C++引入自动的类型推导,并不是在向动态语言(强 ...
- C++闭包: Lambda Functions in C++11
表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅.更快速! 它实现了C++11对于支持闭包的支持.首先我们先看一下什么叫做闭包 维基百科上,对于闭包的解释是: In progr ...
- [转载]如何在C++03中模拟C++11的右值引用std::move特性
本文摘自: http://adamcavendish.is-programmer.com/posts/38190.htm 引言 众所周知,C++11 的新特性中有一个非常重要的特性,那就是 rvalu ...
- Singleton(单例)
意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...
- C++中多线程与Singleton的那些事儿
前言 前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton. 看到这个题目后,第一个想法就是用Scott Meyer在<Effe ...
随机推荐
- C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别
全局变量.局部变量.静态全局变量.静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作 ...
- Angualr2 - 使用 VS2015
使用 Vs 2015 快速上手 Angular2 许多程序员希望能够使用 VS2015 作为 IDE 来开发 Angular 2 应用,这里介绍如何设置 VS2015,使用快速上手文件来搭建 ASP. ...
- .net网站能走多远
刚写好了学校网站,请大家帮忙测试一下.不知道怎么sql注入,或者DDoS攻击,我也是大四什么都是摸索阶段,不过这个网站 做了好长时间了,现在终于可以上架了,希望大家能指点一二,谢谢! 地址:http: ...
- 获取访问者的IP
import java.io.Serializable; import java.net.InetAddress; import java.net.UnknownHostException; impo ...
- 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限
在部署IIS时候会出现下图错误,拒绝访问 temp 目录.用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限 解决方法: 在IIS信息管 ...
- FPS中受伤UI在VR游戏中的实现思路
FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...
- 答:SQLServer DBA 三十问之三:有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理
3. 有哪些操作会使用到TempDB:如果TempDB异常变大,可能的原因是什么,该如何处理: tempdb的用途:1)存储专用和全局临时变量,不考虑数据库上下文: 2)与Order by 子句,游标 ...
- autolayout
autolayout.因为之前都是用frame,用代码来做,并且在布局时也很少用storyboard和xib.使得我再这方便经验很欠缺,想用,但是又怕用不好,出现各种意想不到的bug.但是又忽然想到, ...
- R&Rstudio安装各种包
安装rCharts的方法 install.packages('devtools') library(devtools) require(devtools) install_github('ramnat ...
- Linux Shell ---系统命令(1)
date命令 功能说明:显示或设置系统时间与日期. 语 法: date [-d <字符串>][-u][+%H%I%K%l%M%P%r%s%S%T%X%Z%a%A%b%B%c%d%D%j%m ...