购物类型网站建设wordpress购物车表单

web/2025/10/4 14:49:40/文章来源:
购物类型网站建设,wordpress购物车表单,wordpress支持支付宝吗,怎样做酒店网站ppt1.什么是单例模式 在一个项目中#xff0c;全局范围内#xff0c;某个类的实例有且仅有一个#xff0c;通过这个唯一实例向其他模块提供数据的全局访问#xff0c;这种模式就叫单例模式。 类中多对象的操作函数有如下几个#xff1a; 构造函数 #xff1a; 能够创建出一…1.什么是单例模式 在一个项目中全局范围内某个类的实例有且仅有一个通过这个唯一实例向其他模块提供数据的全局访问这种模式就叫单例模式。 类中多对象的操作函数有如下几个 构造函数 能够创建出一个新对象拷贝构造函数 能够根据一个已经存在的对象拷贝出一个新对象赋值操作符重载函数 用一个对象给另一个对象赋值 为了使得类全局只有一个实例我们需要对这些函数做一些处理 构造函数私有化且在类内部只被调用一次 由于使用者在类外部不能使用构造函数所以在类内部创建的这个唯一的对象必须是静态的这样就可以通过类名来访问了为了不破坏类的封装我们都会把这个静态对象的访问权限设置为 private。 类中只有它的静态成员函数才能访问其静态成员变量所以可以给这个单例类提供一个静态函数用于得到这个静态的实例对象。 拷贝构造函数 私有化 或者 禁用(private 或者 delete)赋值操作符重载函数私有化 或者 禁用。这个操作有没有都没影响 单例模式的代码模板 // 定义一个单例模式的类 class Singleton { public:// delete 代表函数禁用, 也可以将其访问权限设置为私有Singleton(const Singleton rhs) delete;Singleton operator(const Singleton rhs) delete;static Singleton* getInstance(); private:Singleton() default;static Singleton* m_obj; };2.单例模式 单例模式可以分为 懒汉式 和 饿汉式。 一、懒汉式 饿汉模式就是在类加载的时候立刻进行实例化这样就得到了一个唯一的可用对象。 定义 // 饿汉模式 在调用 get_instance 之前 实例就已经存在了 // 多线程环境下 , 饿汉模式是线程 安全的 class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {return m_task_queue;}void print() {cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default;static TaskQueue* m_task_queue; };TaskQueue* TaskQueue::m_task_queue new TaskQueue;int main() {TaskQueue* task_queue TaskQueue::getInstance();task_queue-print(); }需要注意的是 在定义这个 TaskQueue 类的时候这个静态的单例对象 m_task_queue 就已经被创建出来了当调用 TaskQueue::get_instance() 的时候对象就已经被实例化了类中的静态成员变量需要在类外初始化饿汉式在多线程环境下是线程安全的 二、懒汉式 懒汉式是在类加载的时候不去创建这个唯一的实例而是在需要使用的时候再进行实例化。 定义 // 懒汉模式 在调用 get_instance 之前 实例存在 , 第一次调用 get_instance 才会实例化对象 // 多线程环境下, 饿汉模式是线程 不安全的 class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {if (m_task_queue nullptr) {//在第一次调用 get_instance() 的时候再初始化m_task_queue new TaskQueue;}return m_task_queue;}void print() {cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default;static TaskQueue* m_task_queue; };TaskQueue* TaskQueue::m_task_queue nullptr;int main() {TaskQueue* task_queue TaskQueue::getInstance();task_queue-print(); }上述代码在单线程环境下是没问题的。但是在多线程环境下就会出问题假设多个线程同时调用 get_instance() 函数并且此时 m_task_queue nullptr那么就可能创建出多个实例这就不符合单例模式的定义。 解决方案一加锁效率比较低 我们可以使用互斥锁 mutex 将创建实例的代码锁住第一次只有一个线程进来创建对象。 代码 // 用 双重检测锁定 解决懒汉式多线程环境下线程不安全的问题 class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {m_mutex.lock(); //加锁if (m_task_queue nullptr){m_task_queue new TaskQueue;}m_mutex.unlock(); //解锁return m_task_queue;}void print() {cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default;static TaskQueue* m_task_queue;static mutex m_mutex; };TaskQueue* TaskQueue::m_task_queue nullptr; mutex TaskQueue::m_mutex;上面代码虽然解决了问题但是 get_instance() 中的锁住的代码段每次就只有一个线程来访问这样效率就非常低。 解决方法二双重检测锁定存在问题 双重检测锁定的思路是在加锁和解锁代码块 之外再加一个 if 判断。这样的话在第一次调用 get_instance() 的线程仍然会阻塞第二次调用 get_instance() 的线程此时 m_task_queue 已经被实例化了也就是不为 nullptr 了那么第二次的线程在来到一个 if 判断的时候就直接退出了不需要再加锁解锁这样效率就提升了。 代码 // 用 双重检测锁定 解决懒汉式多线程环境下线程不安全的问题 class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {//外面再加一层判断if (m_task_queue nullptr) {m_mutex.lock();if (m_task_queue nullptr) {m_task_queue new TaskQueue;}m_mutex.unlock();}return m_task_queue;}void print() {cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default;static TaskQueue* m_task_queue;static mutex m_mutex; };TaskQueue* TaskQueue::m_task_queue nullptr; mutex TaskQueue::m_mutex;实际上 双重检测锁定 的代码还是有问题的。 假设此时有两个线程 A 和 B线程 A 刚好要调用 m_task_queue new TaskQueue; 这一句代码假设此时 m_task_queue nullptr而线程 B 刚好来到第一个 if 判断。 static TaskQueue* get_instance() {//线程B 马上进入下面这个 if 判断if (m_task_queue nullptr) {m_mutex.lock();if (m_task_queue nullptr) {//线程A 马上调用下面这一句代码m_task_queue new TaskQueue;}m_mutex.unlock();}return m_task_queue;}对于 m_task_queue new TaskQueue; 创建对象的这一句代码在底层实际上时会被分成三个步骤 第一步分配内存用于存储 TaskQueue 对象第二步在分配的内存中构造一个 TaskQueue 对象(初始化内存)第三步指针 m_task_queue 指向分配的内存 由于编译器底层对我们的代码进行优化就会将这些指令进行重排序也就是打乱了它本来的步骤。 比如说将上述的步骤重排序之后变成下面的 第一步分配内存用于存储 TaskQueue 对象第二步指针 m_task_queue 指向分配的内存第三步在分配的内存中构造一个 TaskQueue 对象(初始化内存) 即 第二步 和 第三步 颠倒了顺序。 指令重排序在单线程下没有问题在多线程下就有可能出现问题。 假设线程 A 此时刚好把前两步执行完了m_task_queue 此时已经指向一块内存了不过对这块内存进行操作是非法操作因为创建对象还没有完成线程 B 此时正好进入第一个 if 判断此时 m_task_queue 不为 nullptr就直接退出返回了没有构造完全的对象 m_task_queue。 如果线程 B 对这个对象进行操作就会出问题。 解决方法三双重检测锁定 原子变量 效率更低 C 11 引入了 原子变量 atomic 可以解决 双重检测锁定 的问题。 代码 // 用 原子变量 解决双重检测 的问题 class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {TaskQueue* task_queue m_task_queue.load();if (task_queue nullptr) {m_mutex.lock();task_queue m_task_queue.load();if (task_queue nullptr) {task_queue new TaskQueue;m_task_queue.store(task_queue);}m_mutex.unlock();}return task_queue;}void print() {cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default;//static TaskQueue* m_task_queue;static atomicTaskQueue* m_task_queue;static mutex m_mutex; };//TaskQueue* TaskQueue::m_task_queue nullptr; atomicTaskQueue* TaskQueue::m_task_queue; mutex TaskQueue::m_mutex;上面代码中使用原子变量 atomic 的 store() 函数来存储单例对象使用 load() 函数来加载单例对象。 在原子变量中这两个函数在处理指令的时候默认的原子顺序是 memory_order_seq_cst即顺序原子操作 - sequentially consistent这样也就避免了之前的指令重排的问题使用顺序约束原子操作库整个函数执行都将保证顺序执行并且不会出现数据竞态data races缺点就是使用这种方法实现的懒汉模式的单例执行效率更低一些。 解决方法四静态局部变量推荐 在 C 11 直接使用 静态局部变量 在多线程环境下是不会出现问题的。 代码 class TaskQueue { public:// delete 代表函数禁用, 也可以将其访问权限设置为私有TaskQueue(const TaskQueue rhs) delete;TaskQueue operator(const TaskQueue rhs) delete;static TaskQueue* getInstance(){static TaskQueue task_queue;return task_queue;}void print(){cout 我是单例对象 TaskQueue 的一个成员函数... endl;}private:TaskQueue() default; };int main() {TaskQueue* queue TaskQueue::getInstance();queue-print();return 0; }之所以上面代码是线程安全的 是因为 C 11 规定了并且这个操作是在编译时由编译器保证的 如果指令逻辑进入一个未被初始化的声明变量所有并发执行应当等待该变量完成初始化。 三、总结 懒汉模式的缺点是在创建实例对象的时候有安全问题但这样可以减少内存的浪费如果用不到就不去申请内存了。饿汉模式则相反在我们不需要这个实例对象的时候它已经被创建出来占用了一块内存。 四、练习 实现一个 任务队列。生产者线程生产任务加入任务队列消费者线程取出任务队列的任务执行。 类成员 存储任务的容器我们直接使用 STL 中的容器 queue互斥锁(mutex)在多线程访问的情况下用于保护共享数据 成员函数 判断任务队列是否为空往任务队列中添加一个任务往任务队列总删除一个任务从任务队列中取出一个任务 为了简单起见我们用一个 int 数表示一个任务。 代码 #if 1 // 用局部静态变量饿汉式单例 实现任务队列class TaskQueue { public:TaskQueue(const TaskQueue rhs) delete;TaskQueue operator (const TaskQueue rhs) delete;static TaskQueue* get_instance() {static TaskQueue task_queue;return task_queue;}//判断任务队列是否为空bool is_empty() {lock_guardmutex locker(m_mutex);return q.empty();}//删除任务bool delete_task() {lock_guardmutex locker(m_mutex);if (q.empty()) return false;q.pop();return true;}//取出任务 (不删除任务)int take_task() {lock_guardmutex locker(m_mutex);if (q.empty()) return -1;return q.front();}//添加任务void add_task(int task) {lock_guardmutex locker(m_mutex);q.push(task);}private:TaskQueue() default;queueint q;mutex m_mutex; };#endifint main() {TaskQueue* task_queue TaskQueue::get_instance();thread t1([]() {//生产者 t1 给任务队列添加10个任务for (int i 0; i 10; i) {int task i 100;task_queue-add_task(task);cout producer thread produce a task : task , thread id is this_thread::get_id() endl;this_thread::sleep_for(chrono::milliseconds(500));}});thread t2([](){//让生产者线程先执行 保证先有任务this_thread::sleep_for(chrono::milliseconds(500));while (!task_queue-is_empty()) {int task task_queue-take_task();task_queue-delete_task();cout consumer thread consume a task : task , thread id is this_thread::get_id() endl;this_thread::sleep_for(chrono::milliseconds(1000));}});t1.join();t2.join();return 0; }3.参考 本篇博客是对于 单例模式 的整理。 C 单例模式总结5种单例实现方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京网站优化方法中山建网站多少钱

boss直聘翻页这里有个坑 问题: 无限循环中,点击下一页按钮,直到不可点击为止。 发现,在点到第5页的时候,再次点击下一页,直接就点击了页码10,导致流程直接就结束了。 在第5页进行校验&#xff0…

厦门高端网站建设关于网站开发的

总言 主要内容:传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议(传输层一)8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令(netstat、pidof、xargs&am…

网站的建设和维护的钱接广告的平台

订阅一个CSDN的RSS为例。 1、打开RSS阅读器。 2、设置->新增订阅->手动新增 订阅URL:输入http://articles.csdn.net/api/rss.php?tid1000 (可以先在PC上打开下该网页,发现他是一个xml网页。) 订阅名称:自己起一个名字&…

彩票网站开发的物流网站和数据库建设

一个服务器上跑多个程序是非常常见的现象。 但是这样做后会有一个问题&#xff0c;那就是容易造成 Host 头攻击。host 头(host header或称主机头)攻击&#xff0c;非常常见。比如&#xff0c;在 jsp 中&#xff0c;我们通常可能存在类似下面的代码。 <script type"te…

网站宣传的手段有哪些wordpress网站主修改密码

git如何远程创建分支我不知道有什么办法可以直接在远程创建分支而不需要clone到本地。背景需求我的需求是直接在远程服务器上创建一个分支直接在远程服务器上删除一个分支这期间都不需要clone到本地来。原因是当项目有多个repository的时候其中的部分创建了一个分支&#xff0c…

电子商务网站开发技术解决方案网站建设自查情况

从0配置JAVA项目相关环境 写在最前面一、安装Java的jdk环境1. 下载jdk2. 配置jdk3. 配置环境变量 二、在vscode中配置java运行环境1. 下载VSCode2. 下载并运行「Java Extension Pack」 三、安装mysql1.官网下载MySQL2.开始安装如果没有跳过安装成功 3.配置MySQL Server4.环境变…

网站开发工作图解网页视频下载用什么软件最好

Android应用界面开发第一章学习第三部分####1.导入其它人创建的Android Studio项目(重点在第二部分)首先将下载的Project压缩包解压到自己的AS工程目录比如&#xff1a;工程目录然后打开AS软件&#xff0c;关闭其它工程(close project)&#xff0c;然后准备导入刚才解压的文件夹…

网站开发合作协议合同范本微信小程序是干什么用的

进程管理方式首先我们了解一下php的三种不同的进程管理方式&#xff1a;static&#xff1a;静态管理进程。在启动时&#xff0c;master按照pm.max_children配置fork出对应数量的work进程&#xff0c;即work的进程是固定不变的。dynamic&#xff1a;动态管理进程。在fpm启动时先…

扶贫办门户网站建设管理办法ui设计生成器

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

北京专业制作网站公司吗免费微信网站开发

1.引言 在先前探讨中&#xff0c;我们了解到计算机主机内部的硬件资源需要一种高效管控手段&#xff0c;由此催生了操作系统的诞生。操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;&#xff0c;是计算机生态系统中不可或缺的核心组件&#xff0c;以其复杂…

网网站建设公司系统开发总结

Linux中的socket 服务端逻辑客户端逻辑c实现c实现服务端持续接收请求多线程实现 UDP实现 参考 服务端逻辑 创建service_sock创建sockaddr_in结构体变量serv_addr&#xff0c;写明端口和ip将socket和结构体绑定监听socket创建客户端sockaddr_in结构体变量clnt_addr接收客户端请…

怎样把自己做的网站上传河南火焰山网站开发禹

EasyJson是Go语言中对象序列化与反序列化的工具&#xff0c;类似Java中的fastjson和Jackson&#xff0c;能快速对对象进行序列化和反序列化&#xff0c;本次介绍一下使用方法。 版本信息&#xff1a; go1.20.2 1&#xff0c;获取源码 # go get go get -u github.com/mailru…

网站建设怎么做账务处理创卫网站 建设 方案

目录 写在开头 socket服务端&#xff08;基础&#xff09; socket客户端&#xff08;基础&#xff09; 服务端实现&#xff08;可连接多个客户端&#xff09; 客户端实现 数据收发效果 写在开头 近期可能会用python实现一些网络安全工具&#xff0c;涉及到许多关于网络…

易购商城网站怎么做啊专门做卫生间效果图的网站

309.最佳买卖股票时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; dp数组&#xff1a; 模拟状态&#xff1a;买买买 卖 冻卖卖卖 买 卖 dp[i][0] :持有股票 dp[i][1]: 不持有股票&#xff0c;但是之前卖出去的 dp[i][2]: 不持有股票…

南宁网站平台大专动漫设计有出路吗

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 启动工程失败&#xff0c;报错如题&#xff1a; A component required a bean of type gentle.test.Show that could not be found.…

织梦网站后台文章编辑美化代码怎样创建公司网站

介绍 定义了一个Cache结构体&#xff0c;其中使用sync.Map作为底层数据结构来存储缓存项。Set方法用于设置缓存项&#xff0c;指定键、值以及过期时间。Get方法用于获取缓存项&#xff0c;如果缓存项存在且未过期&#xff0c;则返回值和true&#xff0c;否则返回nil和false。方…

建设网站公开教学视频下载做图表用的网站

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; 后续排序按照从上至下或从右至左的顺序进行&#xff0c;具体取决于方向属性的值。WrapPanel 位…

营销网站开发哪家强wordpress副标题的作用

从一篇日记说起我是一个小前端&#xff0c;我有写日记的习惯2020年10月17 天气 晴今天天气不错&#xff0c;心情也跟着好起来了辛辛苦苦加班两个星期终于完成了产品需求&#xff0c;到了要上线的时候了&#xff0c;嘴里也不知不觉哼起了“劳资今晚不加班”的小曲一顿操作猛如虎…

网站空间文件夹网络工程就业前景好吗

直接判断数据过大 相对而言&#xff0c;由2&#xff0c;3&#xff0c;5&#xff0c;7组成的数更少&#xff0c;则先筛选出由2,3,5,7组成的数&#xff0c;再判断这些数中的质数个数即可 #include <iostream> using namespace std; int main() {printf("1903");…

网站买卖交易平台网站制作工具有哪些

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…