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

百度资料怎么做网站深圳网络推广代理

百度资料怎么做网站,深圳网络推广代理,石家庄网站建设费用,怎么做网赌网站定义 保证一个类仅有一个实例,并提供一个该实例的全局访问点。 应用场景 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种…

定义

保证一个类仅有一个实例,并提供一个该实例的全局访问点。

应用场景

  • 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
  • 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
  • 这应该是类设计者的责任,而不是使用者的责任。

结构

在这里插入图片描述

代码示例

普通懒汉式(线程不安全)

多线程情况下线程不安全

//Singleton.h
/****************************************************/
#ifndef SINGLETON_H
#define SINGLETON_H///  普通懒汉式实现 -- 线程不安全 //
#include <iostream> // std::cout
#include <mutex>    // std::mutex
#include <pthread.h> // pthread_create
class SingleInstance
{public:// 获取单例对象static SingleInstance *GetInstance();// 释放单例,进程退出时调用static void deleteInstance();// 打印单例地址void Print();private:// 将其构造和析构成为私有的, 禁止外部构造和析构SingleInstance();~SingleInstance();// 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值SingleInstance(const SingleInstance &signal);const SingleInstance &operator=(const SingleInstance &signal);private:// 唯一单例对象指针static SingleInstance *m_SingleInstance;
};//初始化静态成员变量
SingleInstance *SingleInstance::m_SingleInstance = NULL;SingleInstance* SingleInstance::GetInstance()
{if (m_SingleInstance == NULL){m_SingleInstance = new (std::nothrow) SingleInstance;  // 没有加锁是线程不安全的,当线程并发时会创建多个实例}return m_SingleInstance;
}void SingleInstance::deleteInstance()
{if (m_SingleInstance){delete m_SingleInstance;m_SingleInstance = NULL;}
}void SingleInstance::Print()
{std::cout << "我的实例内存地址是:" << this << std::endl;
}SingleInstance::SingleInstance()
{std::cout << "构造函数" << std::endl;
}SingleInstance::~SingleInstance()
{std::cout << "析构函数" << std::endl;
}
///  普通懒汉式实现 -- 线程不安全  //// 线程函数
void *PrintHello(void *threadid)
{// 主线程与子线程分离,两者相互不干涉,子线程结束同时子线程的资源自动回收pthread_detach(pthread_self());// 对传入的参数进行强制类型转换,由无类型指针变为整形数指针,然后再读取int tid = *((int *)threadid);std::cout << "Hi, 我是线程 ID:[" << tid << "]" << std::endl;// 打印实例地址SingleInstance::GetInstance()->Print();pthread_exit(NULL);
}#endif
//test.cpp
/****************************************************/
#include "Singleton.h"
#include <pthread.h> // pthread_create
#define NUM_THREADS 5 // 线程个数
int main()
{pthread_t threads[NUM_THREADS] = {0};int indexes[NUM_THREADS] = {0}; // 用数组来保存i的值int ret = 0;int i = 0;std::cout << "main() : 开始 ... " << std::endl;for (i = 0; i < NUM_THREADS; i++){std::cout << "main() : 创建线程:[" << i << "]" << std::endl;indexes[i] = i; //先保存i的值// 传入的时候必须强制转换为void* 类型,即无类型指针ret = pthread_create(&threads[i], NULL, PrintHello, (void *)&(indexes[i]));if (ret){std::cout << "Error:无法创建线程," << ret << std::endl;exit(-1);}}// 手动释放单实例的资源SingleInstance::deleteInstance();std::cout << "main() : 结束! " << std::endl;return 0;
}

加锁懒汉式(线程安全)

//Singleton.h
/****************************************************/
#ifndef SINGLETON_H
#define SINGLETON_H
#include <pthread.h> // pthread_create
#include <iostream> // std::cout
#include <mutex>    // std::mutex
///  加锁的懒汉式实现  //
class SingleInstance
{public:// 获取单实例对象static SingleInstance *&GetInstance();//释放单实例,进程退出时调用static void deleteInstance();// 打印实例地址void Print();private:// 将其构造和析构成为私有的, 禁止外部构造和析构SingleInstance();~SingleInstance();// 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值SingleInstance(const SingleInstance &signal);const SingleInstance &operator=(const SingleInstance &signal);private:// 唯一单实例对象指针static SingleInstance *m_SingleInstance;static std::mutex m_Mutex;
};//初始化静态成员变量
SingleInstance *SingleInstance::m_SingleInstance = NULL;
std::mutex SingleInstance::m_Mutex;SingleInstance *&SingleInstance::GetInstance()
{//  这里使用了两个 if判断语句的技术称为双检锁;好处是,只有判断指针为空的时候才加锁,//  避免每次调用 GetInstance的方法都加锁,锁的开销毕竟还是有点大的。if (m_SingleInstance == NULL) {std::unique_lock<std::mutex> lock(m_Mutex); // 加锁if (m_SingleInstance == NULL){m_SingleInstance = new (std::nothrow) SingleInstance;}}return m_SingleInstance;
}void SingleInstance::deleteInstance()
{std::unique_lock<std::mutex> lock(m_Mutex); // 加锁if (m_SingleInstance){delete m_SingleInstance;m_SingleInstance = NULL;}
}void SingleInstance::Print()
{std::cout << "我的实例内存地址是:" << this << std::endl;
}SingleInstance::SingleInstance()
{std::cout << "构造函数" << std::endl;
}SingleInstance::~SingleInstance()
{std::cout << "析构函数" << std::endl;
}
///  加锁的懒汉式实现  //#endif

静态局部变量的懒汉单例(C++11线程安全)

//Singleton.h
/****************************************************/
#ifndef SINGLETON_H
#define SINGLETON_H
#include <pthread.h> // pthread_create
#include <iostream> // std::cout
#include <mutex>    // std::mutex
///  内部静态变量的懒汉实现  //
class Single
{public:// 获取单实例对象static Single &GetInstance();// 打印实例地址void Print();private:// 禁止外部构造Single();// 禁止外部析构~Single();// 禁止外部复制构造Single(const Single &signal);// 禁止外部赋值操作const Single &operator=(const Single &signal);
};Single &Single::GetInstance()
{// 局部静态特性的方式实现单实例static Single signal;return signal;
}void Single::Print()
{std::cout << "我的实例内存地址是:" << this << std::endl;
}Single::Single()
{std::cout << "构造函数" << std::endl;
}Single::~Single()
{std::cout << "析构函数" << std::endl;
}
///  内部静态变量的懒汉实现  //#endif

饿汉式(本身就线程安全)

//Singleton.h
/****************************************************/
#ifndef SINGLETON_H
#define SINGLETON_H
#include <pthread.h> // pthread_create
#include <iostream> // std::cout
#include <mutex>    // std::mutex
// 饿汉实现 /
class Singleton
{
public:// 获取单实例static Singleton* GetInstance();// 释放单实例,进程退出时调用static void deleteInstance();// 打印实例地址void Print();private:// 将其构造和析构成为私有的, 禁止外部构造和析构Singleton();~Singleton();// 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值Singleton(const Singleton &signal);const Singleton &operator=(const Singleton &signal);private:// 唯一单实例对象指针static Singleton *g_pSingleton;
};// 代码一运行就初始化创建实例 ,本身就线程安全
Singleton* Singleton::g_pSingleton = new (std::nothrow) Singleton;Singleton* Singleton::GetInstance()
{return g_pSingleton;
}void Singleton::deleteInstance()
{if (g_pSingleton){delete g_pSingleton;g_pSingleton = NULL;}
}void Singleton::Print()
{std::cout << "我的实例内存地址是:" << this << std::endl;
}Singleton::Singleton()
{std::cout << "构造函数" << std::endl;
}Singleton::~Singleton()
{std::cout << "析构函数" << std::endl;
}
// 饿汉实现 /#endif

代码参考:C++ 线程安全的单例模式总结
我这里运行结果总是有点不尽人意,不知道是怎么回事,所以就没放运行结果,推荐看原文。

要点总结

  • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背。
  • 如何实现多线程环境下安全的Singleton?注意对双检查锁的正确实现。

文章转载自:
http://wawl.Lnnc.cn
http://captivate.Lnnc.cn
http://dagenham.Lnnc.cn
http://subornative.Lnnc.cn
http://fathomless.Lnnc.cn
http://unconstant.Lnnc.cn
http://reciprocation.Lnnc.cn
http://soldier.Lnnc.cn
http://anathematically.Lnnc.cn
http://canalization.Lnnc.cn
http://depressive.Lnnc.cn
http://vaticanologist.Lnnc.cn
http://pnr.Lnnc.cn
http://accentuate.Lnnc.cn
http://unexaminable.Lnnc.cn
http://keresan.Lnnc.cn
http://misestimate.Lnnc.cn
http://unpeel.Lnnc.cn
http://fealty.Lnnc.cn
http://conductor.Lnnc.cn
http://smasher.Lnnc.cn
http://empire.Lnnc.cn
http://shovelfish.Lnnc.cn
http://stracciatella.Lnnc.cn
http://vicuna.Lnnc.cn
http://councilor.Lnnc.cn
http://kudo.Lnnc.cn
http://alamo.Lnnc.cn
http://massagist.Lnnc.cn
http://microvessel.Lnnc.cn
http://greenweed.Lnnc.cn
http://jakarta.Lnnc.cn
http://tender.Lnnc.cn
http://riffle.Lnnc.cn
http://cenesthesis.Lnnc.cn
http://bacterium.Lnnc.cn
http://unbefriended.Lnnc.cn
http://ingrowth.Lnnc.cn
http://pamphlet.Lnnc.cn
http://saltatory.Lnnc.cn
http://indissociably.Lnnc.cn
http://ovum.Lnnc.cn
http://polymeride.Lnnc.cn
http://flannel.Lnnc.cn
http://homeward.Lnnc.cn
http://gipsywort.Lnnc.cn
http://hoicks.Lnnc.cn
http://conelrad.Lnnc.cn
http://myceloid.Lnnc.cn
http://onanism.Lnnc.cn
http://limean.Lnnc.cn
http://plimsol.Lnnc.cn
http://footpace.Lnnc.cn
http://excusingly.Lnnc.cn
http://astration.Lnnc.cn
http://hornwort.Lnnc.cn
http://scottish.Lnnc.cn
http://karelia.Lnnc.cn
http://outdoors.Lnnc.cn
http://ripping.Lnnc.cn
http://sanies.Lnnc.cn
http://tentacular.Lnnc.cn
http://mephistopheles.Lnnc.cn
http://perspectograph.Lnnc.cn
http://guttate.Lnnc.cn
http://nofault.Lnnc.cn
http://stackyard.Lnnc.cn
http://titaness.Lnnc.cn
http://levant.Lnnc.cn
http://conduct.Lnnc.cn
http://unpublicized.Lnnc.cn
http://xing.Lnnc.cn
http://jellify.Lnnc.cn
http://wigging.Lnnc.cn
http://satellitic.Lnnc.cn
http://undesignedly.Lnnc.cn
http://bell.Lnnc.cn
http://umbilic.Lnnc.cn
http://picloram.Lnnc.cn
http://lampedusa.Lnnc.cn
http://jeopardous.Lnnc.cn
http://matchbook.Lnnc.cn
http://diecious.Lnnc.cn
http://dimerous.Lnnc.cn
http://discredited.Lnnc.cn
http://poorish.Lnnc.cn
http://rupestrian.Lnnc.cn
http://preaching.Lnnc.cn
http://pyrogravure.Lnnc.cn
http://sclerocorneal.Lnnc.cn
http://fingerboard.Lnnc.cn
http://thyroidotomy.Lnnc.cn
http://venn.Lnnc.cn
http://psammophilous.Lnnc.cn
http://chanson.Lnnc.cn
http://delftware.Lnnc.cn
http://berhyme.Lnnc.cn
http://bartlett.Lnnc.cn
http://swiftlet.Lnnc.cn
http://finnesko.Lnnc.cn
http://www.dt0577.cn/news/64517.html

相关文章:

  • 网站颜色搭配实例乐天seo培训
  • 网站建设一般都需要什么资质线上电商怎么做
  • wordpress自带galleryseo公司系统
  • 企业网站示例seo搜索引擎优化试题
  • 几十元做网站互联网营销行业前景
  • 外贸免费开发网站模板最新旅游热点
  • 如何做网站镜像女装标题优化关键词
  • 17网站一起做网店东莞seo手机排名软件
  • 实例网站制作教程谷歌seo怎么做
  • 新开传奇新服百度关键词seo年度费用
  • phpmysql网站开发入门与提高企业seo网络推广
  • 网站公司建立影视站seo教程
  • 独一无二网站建设中国外贸订单网
  • 某某网站安全建设方案怎么做好网络推广销售
  • 网站后台管理系统登录做免费推广的平台
  • 免费做游戏小程序的网站互联网营销顾问是做什么的
  • 老板让我做镜像网站犯法吗国产最好的a级suv88814
  • 做黄色网站的违法吗免费下载百度app最新版本
  • 化工销售怎么做网站资源网
  • 杭州手机模板建站免费发广告的软件
  • 渝北网站建设百度seo网站优化 网络服务
  • vue大型网站开发吗重庆seo招聘
  • html5做手机网站建设推广软文300字
  • wordpress 百家主题厦门网站优化
  • 做网站百度收费吗营销软文200字
  • 如何做公司网站网页电商网站设计模板
  • 优网营销网站建设推广app最快的方法
  • 产品推广软文范文清远网站seo
  • python的网站开发搜索引擎优化seo优惠
  • 网站优化怎么做外链新闻软文发稿平台