开封网站seo工作中网页开发方案

web/2025/10/8 11:07:44/文章来源:
开封网站seo,工作中网页开发方案,wordpress转换中文,网店运营都要做什么目录 线程安全和重⼊问题 死锁和活锁 死锁 死锁四个必要条件 活锁 STL,智能指针和线程安全 线程安全的单例模式 饿汉模式 懒汉模式 懒汉模式实现单例模式(线程安全版本) 饿汉模式实现单例模式 我们来学习单例模式与线程安全 线程安全和重⼊问题 线程安全#xff…目录 线程安全和重⼊问题 死锁和活锁 死锁 死锁四个必要条件 活锁 STL,智能指针和线程安全 线程安全的单例模式 饿汉模式 懒汉模式 懒汉模式实现单例模式(线程安全版本) 饿汉模式实现单例模式 我们来学习单例模式与线程安全 线程安全和重⼊问题 线程安全就是多个线程在访问共享资源时能够正确地执⾏不会相互⼲扰或破坏彼此的执⾏结 果。⼀般⽽⾔多个线程并发同⼀段只有局部变量的代码时不会出现不同的结果。但是对全局变量 或者静态变量进⾏操作并且没有锁保护的情况下容易出现该问题。 重⼊同⼀个函数被不同的执⾏流调⽤当前⼀个流程还没有执⾏完就有其他的执⾏流再次进⼊ 我们称之为重⼊。⼀个函数在重⼊的情况下运⾏结果不会出现任何不同或者任何问题则该函数被 称为可重⼊函数否则是不可重⼊函数。 学到现在其实我们已经能理解重⼊其实可以分为两种情况 多线程重⼊函数 和信号导致⼀个执⾏流重复进⼊函数 所以上面这些都可以不用看的直接输出结论 全局变量属于临界资源。 死锁和活锁 死锁 死锁是指在⼀组进程中的各个进程均占有不会释放的资源但因互相申请被其他进程所站⽤不会 释放的资源⽽处于的⼀种永久等待状态。 死锁是指两个或多个线程因为相互等待对方释放资源导致它们永远无法继续执行的状态。 就是多个线程申请多个未释放的锁然后他们各自却持有这些锁(未解锁)导致都需要等待对方释放比如A线程持有锁aB线程持有锁b那B今天来申请锁AA申请锁b这样AB线程都需要各自等待对方释放才能申请成功跟那个shared_ptr的循环引用无法释放一样的道理。 死锁本质上就是多个线程交叉持有对方需要的资源但又都不释放导致所有线程都卡死在等待状态。 只有一个线程申请锁时也可能导致死锁的自己重复申请自己上次没有释放的锁怎么解决死锁问题只能使用外部外部干预要干预首先了解死锁四个必要条件。 死锁四个必要条件 互斥条件⼀个资源每次只能被⼀个执⾏流使⽤如果多个执行流可以访问同一个锁怎么可能会死锁呢。破坏这个条件不太可能违背锁的意愿。 请求与保持条件⼀个执⾏流因请求资源⽽阻塞时对已获得的资源保持不放。 不剥夺条件⼀个执⾏流已获得的资源在末使⽤完之前不能强⾏剥夺就是一个线程使用锁进入临界区访问具有原子性还没访问完不能解锁。 循环等待条件若⼲执⾏流之间形成⼀种头尾相接的循环等待资源的关系导致死锁完全是在锁上等待导致的。打破这个简单呀使用try_lock进行申请锁就可以了呀锁不可用就返回false。 所以如何避免死锁就是破坏死锁的四个必要条件中的一个就可以了破坏循环等待条件问题资源⼀次性分配使⽤超时机制、加锁顺序⼀致也可以避免锁未释放的场景。 活锁 活锁是指多个线程不断地 相互让步但因为策略问题导致它们无法取得进展活锁和死锁的区别就是线程不会一直等待一个没有解锁的锁而是一直不断的申请直至申请成功。相当于这些线程一直在申请结果没有成功没有成功还一直在申请。 由于不停的申请锁会带来CPU的高占用所以也是程序禁止的一种情况。 STL,智能指针和线程安全 STL中的容器不一定都是线程安全的大部分函数都不支持重入所以都是线程不安全的STL的设计初衷是将性能挖掘到极致⽽⼀旦涉及到加锁保证线程安全会对性能造成巨⼤的影 响。⽽且对于不同的容器加锁⽅式的不同性能可能也不同(例如hash表的锁表和锁桶)。因此STL默认不是线程安全如果需要在多线程环境下使⽤往往需要调⽤者⾃⾏保证线程安全。 智能指针是线程安全的所以我们才愿意将一个线程交给他管理对于unique_ptr由于只是在当前代码块范围内⽣效因此不涉及线程安全问题。 对于shared_ptr多个对象需要共⽤⼀个引⽤计数变量所以会存在线程安全问题。但是标准库实现的时 候考虑到了这个问题基于原⼦操作(CAS)的⽅式保证shared_ptr能够⾼效原⼦的操作引⽤计数。 但是智能指针指向的对象不一定是线程安全的只是智能指针的操作的线程安全的。 线程安全的单例模式 某些类只应该具有⼀个对象(实例)就称之为单例。 例如⼀个男⼈只能有⼀个媳妇。 在很多服务器开发场景中经常需要让服务器加载很多的数据(上百G)到内存中此时往往要⽤⼀个单例 的类来管理这些数据。 单例模式主要分为饿汉模式和懒汉模式。要实现单例那这两种模式都是禁止拷贝的而且初始化函数必须放为私有不让外部直接通过构造函数访问。 饿汉模式 吃完饭, ⽴刻洗碗, 这种就是饿汉⽅式.因为下⼀顿吃的时候可以⽴刻拿着碗就能吃饭。也就是饿汉模式里面肯定已经创建出了一个静态的对象等你要调用的时候通过一个static函数返回保证返回函数和创建的静态变量在类中只有一份防止拷贝。 懒汉模式 吃完饭, 先把碗放下, 然后下⼀顿饭⽤到这个碗了再洗碗, 就是懒汉⽅式就是需要时才创建对象的机制属于延迟创建/加载同样也只有一个对象所以new出来的对象需要装在一个static指针里面而这个指针是类里面已经创建好的。 反正需要时才调用getinstance创建然后返回。存在⼀个严重的问题线程不安全。 第⼀次调⽤GetInstance的时候如果两个线程同时调⽤可能会创建出两份T对象的实例 但是后续再次调⽤就没有问题了此时inst就不是空了不能创建对象了。 懒汉模式实现单例模式(线程安全版本) #pragma once #includeiostream using namespace std; #includememory #includeunistd.h #includevector #includestring #includequeue #includefunctional // #includepthread.hpp #includemutex.hpp #includecond.hpp #includelog.hppnamespace threadpoolmodule {using namespace lockmodule;using namespace threadmodule;using namespace condmodule;using namespace logmodule;using thread_t shared_ptrthread;//用来做测试的线程方法void defaulttest(){while (true){LOG(loglevel::DEBUG) 我是一个测试方法;sleep(1);}}const static int defaultnum 5;templateclass Tclass threadpool{private:bool isempty(){return _taskq.empty();}void HandleTask(string name){LOG(loglevel::INFO) 线程进入HandleTask的逻辑\n;while (true){T t;{lockguard lockguard(mut);// 1.拿任务while (isempty() _isrunning){_wait_num;_cond.wait(mut);_wait_num--;}if (isempty() !_isrunning){break;}t _taskq.front();_taskq.pop();}//2 处理任务t(name); //规定未来所有的任务处理都是必须提供()直接调用的方法}LOG(loglevel::INFO) 线程 name 退出;}private:threadpool(): _num(defaultnum), _wait_num(0),_isrunning(false){for (int i 0; i _num; i){//_threads.push_back(make_sharedthread(bind(threadpool::HandleTask, this, placeholders::_1)));LOG(loglevel::INFO) 构键线程 _threads.back()-getname() 对象 。。。成功;}}public:threadpoolT operator(const threadpoolT) delete; //使用operator的赋值拷贝不能用了threadpool(const threadpoolT) delete; //赋值拷贝不能用了static threadpoolT* getinstance(){LOG(loglevel::INFO) 单例首次被执行需要加载对象...;if (instance nullptr){instance new threadpoolT();}return instance;}void start(){if (_isrunning){return;}_isrunning true;for (auto thread_ptr : _threads){thread_ptr-start();LOG(loglevel::INFO) 启动线程 thread_ptr-getname() 。。。成功;}}void equeue(T in){lockguard lockguard(mut);if (!_isrunning){return;}_taskq.push(move(in));if ( _wait_num){_cond.notify();}}void stop(){//让里面的线程都重新自己退出//退出之前需要将所有的任务都处理完所以需要一次性唤醒所有在等待的线程if (_isrunning){_isrunning false;if (_wait_num){_cond.notifyall();}}}void join(){for (auto thread_ptr : _threads){thread_ptr-join();LOG(loglevel::INFO) 停止线程 thread_ptr-getname() 。。。成功;}}~threadpool(){}private:vectorthread_t _threads; //线程池中的线程初始个数在数组里面int _num; //线程池的容量queueT _taskq; //线程池中的任务队列mutex mut;cond _cond;int _wait_num; //等待队列线程bool _isrunning;static threadpoolT* instance;};templateclass TthreadpoolT* threadpoolT::instance nullptr; //在外面初始化, 私有的static成员可以在类外初始化 };instance必须放私有这样比较安全。 懒汉模型这种延迟生成按需生成的技术在操作系统内核用的还是比较多的像什么写时拷贝malloc创建空间物理地址的映射都是。 “不到万不得已绝不提前分配”这种按需分配的策略在操作系统内核中极为常见既能提升性能又能节省资源。 但是外面的getinstance方法还没有加锁保护所以需要多增加一个锁进行保护。进入函数的时候立即加锁加锁前需要先判断是否满足instance是空的不然白加锁了为什么使用双重判断呢外层是为了防止白加锁内层是为了防止加锁失败或者其他原因导致多个线程进来从而导致instance被赋值两次。 静态成员函数不能直接访问类的非静态成员变量所以这个锁也应该是静态的才可以被访问到。 private:vectorthread_t _threads; //线程池中的线程初始个数在数组里面int _num; //线程池的容量queueT _taskq; //线程池中的任务队列mutex mut;static mutex _lock;cond _cond;int _wait_num; //等待队列线程bool _isrunning;static threadpoolT* instance;};templateclass TthreadpoolT* threadpoolT::instance nullptr; //在外面初始化, 私有的static成员可以在类外初始化templateclass Tmutex threadpoolT::_lock; 饿汉模式实现单例模式 #pragma once #includeiostream using namespace std; #includememory #includeunistd.h #includevector #includestring #includequeue #includefunctional // #includepthread.hpp #includemutex.hpp #includecond.hpp #includelog.hppnamespace threadpoolmodule {using namespace lockmodule;using namespace threadmodule;using namespace condmodule;using namespace logmodule;using thread_t shared_ptrthread;//用来做测试的线程方法void defaulttest(){while (true){LOG(loglevel::DEBUG) 我是一个测试方法;sleep(1);}}const static int defaultnum 5;templateclass Tclass threadpool{private:bool isempty(){return _taskq.empty();}void HandleTask(string name){LOG(loglevel::INFO) 线程进入HandleTask的逻辑\n;while (true){T t;{lockguard lockguard(mut);// 1.拿任务while (isempty() _isrunning){_wait_num;_cond.wait(mut);_wait_num--;}if (isempty() !_isrunning){break;}t _taskq.front();_taskq.pop();}//2 处理任务t(name); //规定未来所有的任务处理都是必须提供()直接调用的方法}LOG(loglevel::INFO) 线程 name 退出;}private:threadpool(): _num(defaultnum), _wait_num(0),_isrunning(false){for (int i 0; i _num; i){//_threads.push_back(make_sharedthread(bind(threadpool::HandleTask, this, placeholders::_1)));LOG(loglevel::INFO) 构键线程 _threads.back()-getname() 对象 。。。成功;}}public:threadpoolT operator(const threadpoolT) delete; //使用operator的赋值拷贝不能用了threadpool(const threadpoolT) delete; //赋值拷贝不能用了static threadpoolT* getinstance(){LOG(loglevel::INFO) 单例首次被执行需要加载对象...;return instance;}void start(){if (_isrunning){return;}_isrunning true;for (auto thread_ptr : _threads){thread_ptr-start();LOG(loglevel::INFO) 启动线程 thread_ptr-getname() 。。。成功;}}void equeue(T in){lockguard lockguard(mut);if (!_isrunning){return;}_taskq.push(move(in));if ( _wait_num){_cond.notify();}}void stop(){//让里面的线程都重新自己退出//退出之前需要将所有的任务都处理完所以需要一次性唤醒所有在等待的线程if (_isrunning){_isrunning false;if (_wait_num){_cond.notifyall();}}}void join(){for (auto thread_ptr : _threads){thread_ptr-join();LOG(loglevel::INFO) 停止线程 thread_ptr-getname() 。。。成功;}}~threadpool(){}private:vectorthread_t _threads; //线程池中的线程初始个数在数组里面int _num; //线程池的容量queueT _taskq; //线程池中的任务队列mutex mut;cond _cond;int _wait_num; //等待队列线程bool _isrunning;static threadpoolT instance;};templateclass TthreadpoolT threadpoolT::instance; //在外面初始化, 私有的static成员可以在类外初始化 }; 这个实现起来差不多呀而且完全没有线程安全问题因为就一个对象。

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

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

相关文章

自己电脑上做的网站 怎么让别人看口碑好的五屏网站建设

在硅谷一线大厂所维护的系统服务中,我们经常可以看见SLA这样的承诺。 例如,在谷歌的云计算服务平台Google Cloud Platform中,他们会写着“99.9% Availability”这样的承诺。那什么是“99.9% Availability”呢? 要理解这个承诺是…

西部数码上传网站柳州网站虚拟主机销售价格

介绍 本篇Codelab我们将教会大家如何构建一个简易的OpenHarmony新闻客户端(JS版本)。应用包含两级页面,分别是主页面和详情页面,两个页面都展示了丰富的UI组件,其中详情页的实现逻辑中还展示了如何通过调用相应接口&a…

广州网站建设电话咨询wordpress最新版本

较为官方的概念: 当且仅当规格说明是存在的并且正确,程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能,判断标准以最终用户为准:当程序没有实现其最终用户合理预期的 功能要求时,就是软…

房地产网站建设策划书北京公司电话大全黄页

低功耗技术 功耗构成静态功耗(漏电功耗)动态功耗翻转功耗(Switch Power)短路功耗(Internal Power) 不同类型的标准单元的功耗 低功耗设计方法降低芯片工作电压多阈值工艺方法电源门控(Power Gating)多电压域(Multi-Voltage Domain)体偏置门控时钟一个简单…

班级响应式网站html格式游戏开发物语破解版

一.题目要求 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 二.题目难度 简单 三.输入样例 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示…

清远市住房与城乡建设局的网站查网站加背景音乐

已知有三个数据库mysql,mongodb和redis,已经分别存储了不同的学生信息,数据全部采用字符串类型,只有id和name两个字段(在mongo和redis中键为id,值为name),现需编写代码实现需求:根据指定id获取对应的name和存储该条信息…

网站商城建站app是程序员做出来的吗

1 问题 app,自定义消息通知的时候,在Android8.0手机上收不到通知 2 解决办法 NotificationManager需要创建NotificationChannel,然后调用createNotificationChannel把NotificationChannel传递进去,并且通过setChannelId设置相应的id 3 普通样本代码实现 private static fina…

站长工具综合查询ip情人做网站

在上传文件时,想使用setRequestMethod(“GET”)。结果无效 因为需要使用输出流上传文件,而使用输出流时,HttpURLConnection默认使用post请求。是无法更改的 conn.setDoOutput(true); //允许输出流 与 conn.setR…

计算机网络 网站开发与设计网站推广的方式

背景 闲鱼目前已经是国内最大的闲置物品交易平台,每天都有数以千万计的用户过来闲鱼,以C2C交易为主。在闲鱼里面,用户的C2C购物频率其实是很低的,而纯粹地逛商品feed流是一件挺无聊的事情。在业务上做加法,突破闲鱼用…

jsp网站开发pdf市场营销与网络营销

Linux的 /etc/hosts 文件用于静态地映射主机名到 IP 地址。 通常用于本地网络中的名称解析,它可以覆盖 DNS 的设置。当你访问一个域名时,系统会首先检查 /etc/hosts 文件,如果找到了匹配项,就会使用该 IP 地址,否则会…

进入城乡建设网站怎么竣工备案网站被攻击

1.Local Binary Pattern( LBP) 算法原理 局部二值模式(Local Binary Pattern, LBP)是一种用于描述图像纹理特征的算法。它通过对图像的每个像素点与其邻域像素进行比较,得到一个二进制编码来表示该像素点的纹理信息。 LBP 算法的基本步骤如下: 选择一个中心像素点,并定…

网站资源做外链邢台网站建设免费做网站排名

SPU(Standard Product Unit) 标准化产品单元 SPU是能够描述一个产品的单元,比如说,iPhone8就是一个SPU,与商家、颜色、款式、套餐无关。 SKU(Stock Keeping Unit) 库存量单元 SKU是用来定价和管理库存的,比如说,iPhon…

吉林省级建设行政主管部门政务网站wordpress设置404

在数字化的时代洪流中,开源与闭源的选择不断成为技术界的重要分水岭。随着特斯拉CEO埃隆马斯克的言论及其决策,公开支持开源,并糅合商业理念与技术革新,使得这场辩论再次成为公众关注的焦点。那么,在这场关乎技术发展脉…

郑州网站关键词优化公司wordpress文章添加标签居中

在本届「开源之夏 2024」活动中,MatrixOne开源社区共计上线3个项目任务,最终有 3位同学成功突围。接下来让我们看看每个项目的详细中选情况: 中选学生公示 项目名称:基于大语言模型的操作系统任务自动识别,拆解&#…

网站建设公司人员工资出国劳务信息网

前言 前面我们讲解了Java的基础语法以及面向对象的思想,相信大家已经基本掌握了Java的基本编程。在之前代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的…

希腊网站后缀php网站导航

软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器&#xff0c;类似应用商店 Conda < Miniconda < Anaconda&#xff08;有交互界面&#xff09; Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站&#xff…

蛋糕网站设计石家庄网站建设专家

FTP 1、FTP—文件传输协议 文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 使用 TCP 传输&…

网站描述怎么设置vps搭建wordpress博客

Leetcode 第 374 场双周赛 Problem D 100146. 统计感冒序列的数目&#xff08;组合数学阶乘逆元&#xff09;题目 给你一个整数 n 和一个下标从 0 开始的整数数组 sick &#xff0c;数组按 升序 排序。有 n 位小朋友站成一排&#xff0c;按顺序编号为 0 到 n - 1 。数组 sick 包…

中国站免费推广入口网站页面分析作业

安装 Anaconda 1、下载 Anaconda&#xff1a; 访问 Anaconda 官方网站 (https://www.anaconda.com/products/distribution/) 下载适合您操作系统的 Anaconda 发行版。 2、安装 Anaconda&#xff1a; Windows&#xff1a;运行下载的安装程序&#xff0c;选择“Just Me”…

西宁做网站君博优选网站建设公司推广

简介 使用stroke定义了其图形轮廓。 可以单独定义属性,也可以写在style中 例子 <svg width="500" height="200">1. 单独定义属性<circle cx