什么是线程安全?在一个由多个线程并行执行并共享数据的程序中,线程安全的代码会通过同步机制保证每个线程都能正常正确执行,不会出现数据污染等事故。如何保证线程安全?为共享资源加一把锁,保证每个资源变量在任何时候最多被一个线程占用。让线程也拥有资源,而不是在进程中共享资源。如:使用threadlocal可以为每个线程维护一个私有的局部变量。什么是单例模式?单例模式是指保证一个类在整个系统生命周期内只能产生一个实例,以保证类的唯一性。单例模式的分类单例模式可以分为懒汉和饿汉。两者的区别在于创建实例的时间:懒人:指系统运行时,实例不存在,只有在需要使用实例的时候,才去创建和使用实例。(该方法要考虑线程安全)饿汉式:指系统一运行就初始化创建实例,需要的时候可以直接调用。(本身线程安全,不存在多线程问题)单例类特点构造函数和析构函数是私有类型,目的是禁止外部构造和销毁复制构造和赋值构造函数是私有类型,目的是禁止外部复制和赋值,保证实例的唯一性。类中有一个获取实例的静态函数,可以全局访问。惰性实现——线程不安全//////////////////#include//std::cout#include//std::mutex#include//pthread_createclassSingleInstance{public://获取单例对象staticSingleInstance*GetInstance();//释放单例,进程退出时调用staticvoiddeleteInstance();//打印单例地址voidPrint();private://将其构造和销毁设为私有,禁止外部构造和销毁SingleInstance();?单实例();//将其拷贝构造和赋值构造设为私有函数,禁止对外拷贝和赋值SingleInstance(constSingleInstance&signal);constSingleInstance&operator=(constSingleInstance&signal);private://唯一的单例对象指针staticSingleInstance*m_SingleInstance;};//初始化静态成员变量SingleInstance*SingleInstance::m_SingleInstance=NULL;SingleInstance*SingleInstance::GetInstance(){if(m_SingleInstance==NULL){m_SingleInstance=new(std::nothrow)单实例;//没有锁是线程不安全的,线程并发时会创建多个实例}returnm_SingleInstance;}voidSingleInstance::deleteInstance(){if(m_SingleInstance){deletem_SingleInstance;m_SingleInstance=NULL;}}voidSingleInstance::Print(){std::cout<<"我的实例内存地址是:"<Print();pthread_exit(NULL);}#defineNUM_THREADS5//中的线程数tmain(void){pthread_tthreads[NUM_THREADS]={0};intindexes[NUM_THREADS]={0};//使用数组存储i的值intret=0;诠释我=0;std::cout<<"main():开始..."<lock(m_Mutex);//锁定if(m_SingleInstance==NULL){m_SingleInstance=new(std::nothrow)SingleInstance;}}返回m_SingleInstance;}voidSingleInstance::deleteInstance(){std::unique_locklock(m_Mutex);//锁定if(m_SingleInstance){deletem_SingleInstance;m_SingleInstance=NULL;}}voidSingleInstance::Print(){std::cout<<"我的实例内存地址是:"<