当前位置: 首页 > news >正文

万峰科技.jsp网站开发四酷全书 m上海设计公司网站

万峰科技.jsp网站开发四酷全书 m,上海设计公司网站,微信公众号怎么制作网页,传媒 wordpress文章目录实现 1#xff1a;静态成员实现 2#xff1a;atexit 懒汉模式实现 3#xff1a;原子变量 懒汉模式实现4#xff1a;atexit 饿汉模式* 实现5#xff1a;magic static单例模式#xff1a;保证一个类仅有一个实例#xff0c;并提供一个该实例的全局访问点。 稳… 文章目录实现 1静态成员实现 2atexit 懒汉模式实现 3原子变量 懒汉模式实现4atexit 饿汉模式* 实现5magic static单例模式保证一个类仅有一个实例并提供一个该实例的全局访问点。 稳定点类只有一个实例提供全局变化点有多个类都是单例能否复用代码 实现 1静态成员 构造函数和析构函数私有化禁掉拷贝构造、拷贝赋值、移动构造、移动赋值静态成员函数静态私有成员 前两点针对唯一实例后两点针对全局访问。 问题当程序结束后不会调用析构函数堆上资源无法释放内存泄漏。虽然程序结束后堆上所有的数据被销毁但是无法保存需要持久化的数据。 class Singleton { public:// 静态成员函数全局访问点static Singleton* getInstance() {if(nullptr _pInstance) {_pInstance new Singleton();}return _pInstance;}private:// 构造函数和析构函数私有化Singleton(); ~Singleton(); // 禁掉拷贝构造、拷贝赋值、移动构造、移动赋值Singleton(const Singleton ) delete;Singleton operator(const Singleton) delete;Singleton(Singleton ) delete;Singleton operator(Singleton ) delete;private:// 静态成员静态成员函数只能访问静态成员static Singleton* _pInstance;};// 静态成员需要初始化 Singleton* Singleton::_instance nullptr; 实现 2atexit 懒汉模式 atexit 函数在进程结束后利用回调函数自动释放堆空间。 /* 功能注册给定函数并在进程结束后调用该函数 参数函数指针指向被调用的函数(返回值、参数均为void) */ #include stdlib.h int atexit(void (*function)(void));利用这一特性在进程结束时 atexit 函数调用销毁函数完成析构工作。 问题atexit 函数本身安全但是多线程环境下。存在线程安全问题。 static Singleton* getInstance() {if(nullptr _pInstance) {// 问题多个并发线程可能同时创建对象_pInstance new Singleton();atexit(Singleton::Destructor);}return _pInstance; }为保证线程安全需要加锁。对于加锁操作只有第一次写操作创建对象的时候需要加锁其他时候都是读操作没有必要加锁。因此这里在实现的时候可以采用双重检测 double check的技巧。 #include stdlib.h class Singleton { public:static Singleton* getInstance() {if(nullptr _pInstance) {_pInstance new Singleton();// 线程安全双重检测double check if (nullptr _pInstance) {std::lock_guardstd::mutex lock(_mutex);if (nullptr _pInstance) {// 问题多线程环境下cpu reorder_pInstance new Singleton();atexit(Singleton::Destructor);}}return _pInstance;// 注册回调函数进程结束后调用销毁函数atexit(Singleton::Destructor);}return _pInstance;}private:Singleton(); ~Singleton(); Singleton(const Singleton ) delete;Singleton operator(const Singleton) delete;Singleton(Singleton ) delete;Singleton operator(Singleton ) delete;// 注册销毁函数为atexit的回调函数用于在进程结束后释放堆空间static void Destructor() {if (nullptr ! _instance) { delete _instance;_instance nullptr;}}private:static Singleton* _pInstance;};Singleton* Singleton::_instance nullptr; 问题new 操作符指令重排 C 98 表达单线程语义。而在多核多线程的情况下若 cpu 指令重排例如对于 new 运算符的指令执行分配内存、调用构造函数、返回指针。若发生 cpu 指令重排会优化为分配内存、返回指针却还没有调用构造函数初始化数据。此时若有其他线程访问可能造成程序的崩溃。 实现 3原子变量 懒汉模式 C 11多线程语义cpu 指令重排提供同步原语原子变量、内存屏障等 原子变量解决 原子性问题可见性问题load 可以看见其他线程最新操作的数据 store 修改数据让其他线程可见执行序问题memory_order_acuire不能重排指令memory_order_release松散指令可以重排指令。 内存屏障内存栅栏解决 可见性问题执行序问题 使用原子变量解决原子性、可见性、执行序 class Singleton { public:static Singleton * GetInstance() {Singleton* tmp _instance.load(std::memory_order_acquire);if (tmp nullptr) {std::lock_guardstd::mutex lock(_mutex);tmp _instance.load(std::memory_order_acquire);if (tmp nullptr) {tmp new Singleton;_instance.store(tmp, memory_order_release);atexit(Destructor);}}return tmp;} ...static std::atomicSingleton* _instance;static std::mutex _mutex; }; std::atomicSingleton* Singleton::_instance; // 静态成员需要初始化 std::mutex Singleton::_mutex; // 互斥锁初始化 改进若构造函数中存在其他原子性操作则可以使用松散的指令执行方式提升运行速度。使用内存屏障避免 tmp 指针在 new 操作未执行完就返回给用户。 原子变量解决原子性、可见性内存栅栏解决执行序 class Singleton { public:static Singleton * GetInstance() {Singleton* tmp _instance.load(std::memory_order_relaxed);// 获取内存屏障std::atomic_thread_fence(std::memory_order_acquire);if (tmp nullptr) {std::lock_guardstd::mutex lock(_mutex);tmp _instance.load(std::memory_order_relaxed);if (tmp nullptr) {tmp new Singleton;// 释放内存屏障std::atomic_thread_fence(std::memory_order_release);_instance.store(tmp, std::memory_order_relaxed);atexit(Destructor);}}return tmp;}...static std::atomicSingleton* _instance;static std::mutex _mutex; }; std::atomicSingleton* Singleton::_instance; // 静态成员需要初始化 std::mutex Singleton::_mutex; // 互斥锁初始化 问题代码复杂书写困难。 实现4atexit 饿汉模式 懒汉模式是延迟加载饿汉模式是提前加载。当系统开始运行加载类的时候就初始化类实例其他线程无法再创建实例实现线程安全。 class Singleton { public:static Singleton* Singleton::getInstance() {if(nullptr _pInstance) {_pInstance new Singleton();atexit(Singleton::Destructor);}return _pInstance;} ... };// 全局初始化使其在进程创建之前就不为空防止子进程创建对象 Singleton* Singleton::_instance getInstance();问题无论是否需要该类实例都必须提前创建。 * 实现5magic static 源自C effectiveC 11 magic static 特性参考官方文档静态局部变量推荐使用。 如果变量在初始化的时候并发同时进入声明语句并发线程会阻塞等待初始化结束。线程安全。静态局部变量首次经过它的声明才会被初始化在其后所有的调用中声明都会被跳过。 因此使用定义在栈上的局部静态变量保存单例对象具备所有优点 延迟加载系统自动调用析构函数回收内存没有 new 操作带来的 cpu reorder 操作线程安全 class Singleton { public:static Singleton GetInstance() {// magic static// 定义在栈上的局部静态变量进程结束后自动释放static Singleton instance;return instance;}private:Singleton(); ~Singleton(); Singleton(const Singleton ) delete;Singleton operator(const Singleton) delete;Singleton(Singleton ) delete;Singleton operator(Singleton ) delete; };
http://www.w-s-a.com/news/202212/

相关文章:

  • 成都网站品牌设计策划课堂网站开发
  • 做直播网站赚钱公司网站空间怎么续费
  • 企业网站制作公司有哪些太原网站建设 thinkphp3.2
  • 云集网站哪个公司做的百度竞价排名怎么做
  • 做网站公司赚钱吗网站建设英语翻译
  • 网络公司除了做网站产品设计作品
  • dede网站模板替换湘潭建设路街道网站
  • 东莞网站优化效果如何网络设计工作
  • 网站备案系统验证码出错的解决方案任丘建设银行网站
  • 个人博客建站wordpress叮当app制作
  • 网站式的公司记录怎么做二手书网站策划书
  • 营销型网站的建设重点是什么帝国程序和WordPress
  • 正能量网站推荐不需要下载巴中网站建设开发公司
  • 学生模拟网站开发西安seo平台
  • 免费的app推广平台免费网站seo
  • 建一个个人网站网站建设中小企业广西
  • 优惠券网站做淘客违规吗个人建网站运营.
  • 旅游网站制作建设华大基因 网站建设
  • sem推广竞价托管南京seo网站优化
  • 网站优化网站建站教程网站建设 成都
  • 网站 配色表html代码在线
  • 城乡和建设部建造师网站众筹平台网站建设
  • 外贸网站模板免费下载微网站制作软件
  • 一个新的网站怎么做宣传技术先进的网站建
  • 福建网站建设有限公司需求网站
  • 生物科技企业网站做的比较好的企业培训网站模板
  • 南京 高端网站建设网站备案密码怎么找回
  • 蛋糕店网站模板建设电子商务系统网站
  • 海口网站建设优化公司网站开发要加班吗
  • 建设一个网站需要注意哪些要求群晖的网站开发