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

人个做外贸用什么网站好桂林两江四湖景区导游词

人个做外贸用什么网站好,桂林两江四湖景区导游词,免费建站网站一区黄在线国产,基础建设期刊在哪个网站可以查线程安全 单例模式在单线程中,当然是安全的。但是如果在多线程中,由于并行判断,可能会导致创建多个实例。那么如何保证在多线程中单例还是只有一个实例呢? 常见的三种方式: 局部静态变量 原理和饿汉模式相似,利用static只会初始…

线程安全
单例模式在单线程中,当然是安全的。但是如果在多线程中,由于并行判断,可能会导致创建多个实例。那么如何保证在多线程中单例还是只有一个实例呢?
常见的三种方式:

局部静态变量
原理和饿汉模式相似,利用static只会初始化一次的特性,并且在第一次调用的情况下才会被初始化。推荐使用

class Singleton {
private:
    Singleton() { };
public:
    static Singleton* getInstance() {
        static Singleton *instance = new Singleton();
        return instance;
    }
};

饿汉模式

原理:利用static,在程序编译的时候就调用构造函数实现单例,这样做的优点是保证线程安全,但是缺点就是无论后续是否用到,在编译的时候就会创建,会导致启动性能降低。
实现方法:

class Singleton_Hungry {
public:
    static Singleton_Hungry* getInstance() {
        return singleton;
    }
private:
    Singleton_Hungry() {
        cout << "Hungry creat." << endl;
    }
    static Singleton_Hungry* singleton;
};
Singleton_Hungry* Singleton_Hungry::singleton = new Singleton_Hungry();

懒汉模式

原理:利用线程锁,在获取实例的时候判断实例加上线程锁,保证判断的条件只允许一个线程操作。利用锁也可以保证单例只有一个实例。
实现方法:

#include <mutex>
std::mutex mu;
class Singleton_Lazy {
public:
     static Singleton_Lazy* getInstance() {
        if (singleton == NULL) {
            mu.lock();//打开锁
            if (singleton == NULL) {
                singleton = new Singleton_Lazy();
            }
            mu.unlock();//关闭锁
        }
        return singleton;
     }
private:
    Singleton_Lazy() {
        cout << "Lazy creat." << endl;
    }
    static Singleton_Lazy* singleton;
};
Singleton_Lazy* Singleton_Lazy::singleton = NULL;

实践验证

在linux系统上通过命令行g++ single.cpp --std=c++11 -lpthread编译

#include <iostream>
#include <mutex>
#include <thread>
#include <unistd.h>

using namespace std;
mutex mu;

class Singleton_Hungry {
public:
    static Singleton_Hungry* getInstance() {
        return singleton;
    }
private:
    Singleton_Hungry() {
        cout << "Hungry creat." << endl;
    }
    static Singleton_Hungry* singleton;
};
Singleton_Hungry* Singleton_Hungry::singleton = new Singleton_Hungry();

class Singleton_Lazy {
private:
    Singleton_Lazy() {
        cout << "Lazy creat." << endl;
    }
    static Singleton_Lazy* singleton;
public:
     static Singleton_Lazy* getInstance() {
        if (singleton == NULL) {
            //mu.lock();//打开锁
            if (singleton == NULL) {
                singleton = new Singleton_Lazy();
            }
            //mu.unlock();//关闭锁
        }
        return singleton;
     }
};
Singleton_Lazy* Singleton_Lazy::singleton = NULL;

void thr(int t) {
    cout << t << " pthread id: " << pthread_self() << endl;
    for(int i = 0; i < 3; i++) {
        Singleton_Lazy *lazy = Singleton_Lazy::getInstance();
        Singleton_Hungry *hungry = Singleton_Hungry::getInstance();
        cout << t << " lazy addr:" << lazy << endl;
        cout << t << " hungry addr:" << hungry << endl;
    }
}

int main() {
    cout<<"main process id: "<<getpid()<<endl;
    cout<<"main pthread id:"<< pthread_self()<<endl;
    thread thread1(thr, 1);
    thread thread2(thr, 2);
    thread1.join();
    thread2.join();
    return 0;
}

结果分析

结果和预想一致,饿汉模式在程序编译阶段调用构造函数,懒汉模式在调用的时候创建,如果不加线程锁会导致创建多个实例。

【C++】保证线程安全的单例模式_c++ 线程安全单例模式-CSDN博客

http://www.yayakq.cn/news/512941/

相关文章:

  • 网络公司网站开发案例做网站怎么连数据库
  • dedecms网站logo网站开发专业的领军人物
  • 微网站公司利用wordpress做api提供者
  • 厦门做网站seo的有哪些网站是flash型
  • 嘉兴企业网站模板建站wordpress手机端侧边工具栏
  • 网站改进建议有哪些江门网站推广优化
  • 做网站属于It行业吗大连企业网站制作
  • 扬中网站建设如何做平面还有什么素材网站
  • 新泰网站建设流程wordpress调用文件上传
  • 法治与安全做讲座网站平湖城乡规划建设局网站
  • 做网站用的软件自家房子做民宿的网站
  • 免费用手机建立网站男女直接做网站
  • 福建福清市住房和建设局网站烟台专门做网站的
  • 网站建设哪家公司好网站开发视频教程百度网盘
  • 中国建设银行网站股份结构变化陕西 汽车 网站建设
  • 网站建设实训个人总结3000网站空间的申请
  • 电影vip免费网站怎么做的wordpress 指定分类
  • 微网站做下载链接宝安网站建设(深圳信科)
  • 做购物网站之前做些什么域名邮箱如何注册
  • 网站建设 英汇网络怎么推广网页
  • python php网站开发遵义网吧什么时候恢复营业
  • 佛山企业网站建站天河区网站公司
  • 网站建设需要的文案网站建设关键要做好哪些
  • 火速网站建设免费wordpress主题下载
  • 网站建设方案平台万维网网站备案流程
  • 东莞市做网站的最好的是哪家的wordpress自定义用户字段
  • 申诉网站风险南昌网站建设模板合作
  • 青海环保网站建设公司百度指数怎么看排名
  • 网站建设行业有什么认证吗山东网站备案注意事项
  • 网站建设成功案例深网站建设