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

如何优化网站内部链接电商如何推广

如何优化网站内部链接,电商如何推广,免费建网站,伊滨区网站建设Qt下实现支持多线程的单例模式 Chapter1 Qt下实现支持多线程的单例模式($$$)1. 代码介绍2. 代码之路3. 详细分析3.1 什么是单例3.2 如何让类无法实例化3.3 如何调用这个唯一实例3.4 如何支持多线程3.5 如何解决内存泄漏 4. 结束语 Chapter2 Qt 全局单例类Chapter3 Qt实用技巧设计模式之单例模式唯一实例类通用模板($$$)需求单例模式Qt单例模式示例模板修复bug后的单例模式代码2:使用原子caozuo 实现方式 1、实现单例 把类的构造函数、拷贝构造函数、赋值操作符定义为private的 把获取单例的接口和唯一的实例指针定义为static的不需要实例化直接通过类名即可访问。 2、支持多线程 采用双重校验法在获取单例的函数中使用互斥锁确保不会出现两个线程同时new出这个单例类的实例化。 3、解决内存泄漏 析构单例指针单独写一个类利用这个类的析构函数来析构单例指针。 Chapter1 Qt下实现支持多线程的单例模式($$$) 原文链接https://blog.csdn.net/lusanshui/article/details/84142869 1. 代码介绍 实现单例模式的代码很多。 本文的单例模式实现代码是本人一直在工程项目中使用的现拿出和大家交流分享。 本文实现的单例模式支持多线程采用双重校验检索的方式集成析构类杜绝内存泄漏稳定性好。 使用C/Qt的朋友们可以了解一下。 不再废话直接上代码。 2. 代码之路 头文件makelog.h #include QMutex #include QObject class Makelog: public QObject {Q_OBJECTpublic:static Makelog* getInstance(){if (m_pInstance NULL){QMutexLocker mlocker(m_Mutex); //双检索支持多线程if (m_pInstance NULL){m_pInstance new Makelog();}}return m_pInstance;}private:Makelog(){}Makelog(const Makelog){}Makelog operator (const Makelog){}static Makelog* m_pInstance; //类的指针static QMutex m_Mutex;public:class CGarbo //专用来析构m_pInstance指针的类{public:~CGarbo(){if (m_pInstance ! NULL){delete m_pInstance;m_pInstance NULL;}}};static CGarbo m_Garbo; };makelog.cpp文件 Makelog* Makelog::m_pInstance NULL; Makelog::CGarbo m_Garbo; QMutex Makelog::m_Mutex;支持多线程无内存泄漏的单例模式就实现了。 下面举例说明具体的使用 在头文件中加入一个public函数、一个public变量。 public: void readFile(); QString m_config;在源文件中加入函数具体实现使得readFile()或m_config有实际的意义。 那么在一个工程内的其他类中只需做两个步骤就可以使用这个readFile()函数和m_config变量了。 步骤1包含头文件 #include “makefile.h”步骤2通过单例类入口调用函数或变量 Makelog::getInstance()-readFile(); //使用函数 Makelog::getInstance()-m_config; //使用变量3. 详细分析 3.1 什么是单例 单例是一种软件设计模式采用单例模式书写的类可以确保在一个工程中只有一个对象实例。再通俗点就是一个类写好了之后就不需要也无法再把这个类实例化了因为写这个类的时候已经确保了有且仅有一个已经实例化的对象。 这样不是很蠢么花了这么多功夫写了一个类你告诉我这个类没法用来new出对象了那我怎么使用这个类我写个配合静态变量的静态函数使用起来不是更方便 当然不蠢非但不蠢而且单例模式是所有设计模式中使用最为频繁的一个设计模式。没法new出对象因为单例模式已经帮你new了一个对象而且让你的工程中只有这个对象了使用这个对象只需要包含头文件然后调用接口指针函数就可以了静态的全局函数或变量代码实现起来方便但是不具有类的封装性和灵活性。 3.2 如何让类无法实例化 首先要清楚类实例化无非就是三种方式 1采用构造函数实例化 2用拷贝函数实现实例化 3赋值操作实现实例化。 所以只需要把这个类的构造函数、拷贝函数、赋值操作写成私有的就无法调用这些函数自然就无法实例化了。 正如上文所示的几个函数 private: Makelog(){} //构造函数 Makelog(const Makelog){} //拷贝函数 Makelog operator (const Makelog){} //赋值操作符重写当然如果有一些初始化的操作也可以写在私有构造函数的双括号内。 3.3 如何调用这个唯一实例 广泛采用的做法就是在写一个public的函数作为接口这个函数返回单例类唯一实例的指针。 最简单的写法如下 Makelog* getInstance() { if (m_pInstance NULL) { m_pInstance new Makelog(); //调用private构造函数把唯一实例的指针实例化 } return m_pInstance; } Makelog* m_pInstance; //唯一实例的指针这个写法看着真不错可是这么写遇到了一个小小的悖论。 “我如何去调用执行这个getInstance()函数啊对我需要一个实例化对象才能去执行那我去new个对象等等唯一的实例化对象是通过这个函数才能找到的啊” 有方法解决么当然类的静态方法不需要实例化对象用 类名::方法的形式就可以调用执行了所以把getInstance()函数前加一个static就好了。 但是静态方法只能使用静态成员变量啊那就把唯一实例的指针m_pInstance也变成static的吧。 Ok这样有没有隐患啊隐患static类型的instance存在静态存储区每次调用时都指向的同一个对象。非但没有隐患简直堪称完美 现在上面的代码就变成这样 public: static Makelog* getInstance() { if (m_pInstance NULL { m_pInstance new Makelog(); //用私有构造函数new出了这个类的唯一对象 } return m_pInstance; } private: static Makelog* m_pInstance; //唯一实例指针这样写完全没有问题但是不支持多线程的调用。因为new Makelog()需要时间所以当两个线程同时判断m_pInstance NULL同时执行了m_pInstance new Makelog()这句代码问题就大了。 3.4 如何支持多线程 为了解决3.3节产生的bug广泛采用的方式是双重校验检索的方法。 就是利用互斥锁(用来保证锁内代码最多只有一个线程在同时执行)的方式确保不会出现两个线程同时new出这个单例类的唯一实例的情况发生。 具体代码如下 static Makelog* getInstance() { if (m_pInstance NULL) { QMutexLocker mlocker(m_Mutex); //加锁锁内代码只有一个线程执行 if (m_pInstance NULL) //先执行的线程会进入内部new对象后一个线程判断m_pInstance就不是NULL了 { m_pInstance new Makelog(); } } return m_pInstance; }至此双重校验检索解决多线程问题的单例问题就解决了。当然还可以用原子锁的方法来解决但是灵活性不强也可能是我太外行灵活不起来—。—这里就不介绍了。 3.5 如何解决内存泄漏 解决单例类的内存析构主要就是解决static Makelog* m_pInstance这个指针的析构问题毕竟其他的可以不用指针的嘛。我总结觉得写一个专门用来析构的类是最方便有效和无脑的方法了推荐给大家。 具体就是在单例类中写一个类 public: class CGarbo //专用来析构m_pInstance指针的类 { public: ~CGarbo() //这个类只有析构函数 { if (m_pInstance ! NULL) { delete m_pInstance; m_pInstance NULL; } } }; static CGarbo m_Garbo; //声明一个静态的对象然后在cpp文件中声明一下 Makelog::CGarbo m_Garbo就可以了。 这个类只有析构函数析构函数的作用就是delete单例唯一对象的指针。 析构类声明一个static对象因为静态对象系统会在关闭程序时自动析构就可以执行到析构函数内部的代码了。 4. 结束语 单例模式是非常常用而基础的一个设计模式本文作者第一次写博客有不详或错误之处还请大家指正。对于还在使用C/Qt的初学者请不要因为害怕而不去深究和掌握单例模式这个好用实用的工具。 Chapter2 Qt 全局单例类 原文链接https://blog.csdn.net/z_ujmn/article/details/105299528 单例模式将构造函数私有能够禁止类外生成对象。将拷贝构造函数和赋值操作符重载函数声明为delete以防生成的对象被复制。同时声明一个静态函数和静态互斥锁。静态函数用来生成对象注意静态函数不需要通过对象去调用。互斥锁也声明为静态是因为在静态函数里是不能访问类成员变量的因为静态函数不需要通过对象调用如果可以访问类成员变量它自己也不知道访问的是哪个。 #ifndef APPEVENT_H #define APPEVENT_H#include QObject #include QMutex #include QSharedPointorclass AppEvent : public QObject {Q_OBJECT public:static QSharedPointerAppEvent getInstance();private: explicit AppEvent(QObject *parent 0);AppEvent operator (AppEvent) delete;AppEvent(AppEvent) delete; private:static QSharedPointerAppEvent m_appEvent_ptr;static QMutex m_mutex; signals:public slots: };#endif //APPEVENT_H静态函数加锁前后分别判断一次可以提高效率。互斥锁以及判断对象是否被创建都保证只会存在一个对象。 #include appevent.hAppEvent::AppEvent(QObject *parent) :QObject(parent) {}QSharedPointerAppEvent AppEvent::m_appEvent_ptr; QMutex AppEvent::m_mutex;QSharedPointerAppEvent AppEvent::getInstance() {if (nullptr m_appEvent_ptr){m_mutex.lock();if (nullptr m_appEvent_ptr){m_appEvent_ptr QSharedPointerAppEvent(new AppEvent);}m_mutex.unlock();}return m_appEvent_ptr; }其它文件内引用该全局单例对象时加上单例对象文件的头文件声明时带上extern。注意全局单例对象只可初始化一次。 #include QApplication QSharedPointerAppEvent g_appEvent_ptr AppEvent::getInstace();int main(int argc, char*argv[]) {QApplication a(argc, argv);a.exec(); }Chapter3 Qt实用技巧设计模式之单例模式唯一实例类通用模板($$$) 原文链接https://blog.csdn.net/qq21497936/article/details/80046081 需求 Qt常需要一个类全局调用是设计模式中的单例模式。 单例模式 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 显然单例模式的要点有三个 一是某个类只能有一个实例 二是它必须自行创建这个实例 三是它必须自行向整个系统提供这个实例。 Qt单例模式示例模板此版本重大bug 使用DbService::instance()全局获取该对象 头文件 #ifndef DBSERVICE_H #define DBSERVICE_H#include QObject #include QMutex #include QMutexLockerclass DbService : public QObject {Q_OBJECT public:explicit DbService(QObject *parent 0);public:static DbService * instance();signals:public slots:protected:private:static DbService *_pInstance;static QMutex _mutex; };#endif // DBSERVICE_H源文件存在bug #include DbService.hDbService * DbService::_pInstance 0; QMutex DbService::_mutex;DbService::DbService(QObject *parent) : QObject(parent) {}DbService * DbService::instance() {if(!_pInstance){QMutexLocker lock(_mutex);if(!_pInstance){_pInstance new DbService();}}return _pInstance; }bug感谢网友大神火龙 的帮助 _pInstance new DbService();申请DbService的内存在申请的内存上构造DbService将_pInstance指针指向这个内存 这个new有这么三步 编译器可能是132这么执行的多个线程第一次同时使用时可能出现野指针即编译器先指向内存准备第三步构造时另一个线程获取则出现野指针运行出现段错误。 源文件修复完bug #include DbService.hDbService * DbService::_pInstance 0; QMutex DbService::_mutex;DbService::DbService(QObject *parent) : QObject(parent) {}DbService * DbService::instance() {if(!_pInstance){QMutexLocker lock(_mutex);if(!_pInstance){DbService *pInstance new DbService(); // 修改处_pInstance pInstance; // 修改处}}return _pInstance; }Qt单例模式示例模板修复bug后的单例模式代码2:使用原子caozuo 头文件 #ifndef DBSERVICE_H #define DBSERVICE_H#include QObject #include QMutex #include QMutexLockerclass DbService : public QObject {Q_OBJECT public:explicit DbService(QObject *parent 0);public:static DbService *getInstance();signals:public slots:protected:private:static QAtomicPointerDbService _instance;static QMutex _mutex; };#endif // DBSERVICE_H源文件 #include DbService.hQAtomicPointerDbService DbService::_instance 0; QMutex DbService::_mutex;DbService::DbService(QObject *parent) : QObject(parent) {}DbService * DbService::instance() { #ifndef Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVEif(!QAtomicPointer::isTestAndSetNative())//运行时检测qDebug() Error: TestAndSetNative not supported!; #endif//使用双重检测。/*! testAndSetOrders操作保证在原子操作前和后的的内存访问* 不会被重新排序。*/if(_instance.testAndSetOrdered(0, 0))//第一次检测{QMutexLocker locker(mutex);//加互斥锁。_instance.testAndSetOrdered(0, new DbService);//第二次检测。}return _instance; }
http://www.hkea.cn/news/14305672/

相关文章:

  • wdcp 网站建设wordpress数据写入
  • 亿赐客网站怎么样wap购物网站源码
  • 音乐网站如何做下载优化大师安装桌面
  • 什么是 网站收录施工企业会计王玉红课后答案
  • 广州建网站兴田德润可信建设医院在哪里
  • 海口网站建设联系方式企业文化培训都有哪些内容
  • 家居网站建设 百度文库家装装饰设计
  • c 开发微网站开发网页设计制作作品
  • asp怎么做网站广州网站建设开发设计
  • 网站上的招牌图怎么做小程序源码php
  • 做网站违反广告法手机代理ip免费网址
  • 松江品划网站建设推广优化品牌seo关键词
  • 哈尔滨网站建设公司简单的wordpress模板下载
  • 项目定制开发网站网站开发职业环境分析
  • 看守所加强自身网站建设工作总结莘县做网站
  • 做网站还要买服务器吗旅游网站开发的背景及意义
  • 门户网站安全建设wordpress调取多个分类文章
  • 重庆建设医院官方网站视频直播软件有哪些
  • 做陶瓷公司网站vue做门户网站
  • 在哪人网站要以接it项目做2021深圳装修公司排名前十强
  • 个人做电影网站服务器放国外安全吗怎么才能创个网站
  • 简述网站建设和推广评价指标怎么提交网站
  • 石家庄网站建设团队西安专业网络推广平台
  • 在服务器网站上做跳转页面跳转页面免费软件的定义
  • 民营医院建设网站搭建网页游戏多少钱
  • 网站建设价格标准杭州全案推广
  • 不同用户入口的网站样板iis 无法访问此网站
  • 适用于建设微型网站个人可以备案什么网站
  • 企业网站营销推广方案如何外贸营销推广
  • 网站推广的软件大学生网页设计期末作业