Linux多线程-4

news2024/11/16 10:20:45

在了解完多线程的绝大部分概念之后,我们本篇博客作为Linux多线程中的最后一篇博客,来对其中剩余内进行一个收尾。

目录

1.线程池

1.1引入

1.2原理

1.3优点

1.4实现

2.单例模式

2.1内容

2.2原理

2.3实现

2.3.1饿汉模式实现

2.3.2懒汉模式实现

1.线程池

1.1引入

在之前的线程学习当中,我们对于线程的使用都是即用即创建即销毁,在面对大量任务需要处理时,便会为了提高进程效率来创建线程完成任务,每个任务都会创建一个与之相应的想成功。

但是这样创建多个线程来处理多任务存在两个十分明显的缺点:当某一时刻瞬间产生大量任务(瞬间峰值压力),一次性创建线程过多会导致程序崩溃;当多个任务的处理时间较短,那么进程会将大部分时间浪费在线程的创建和销毁上。

1.2原理

于是我们引入线程池的概念,创建一个由线程组成的池子,当任务(数据)产生,我们便可以直接直接从线程池中分配一个线程来完成该项任务,任务处理完毕线程交回线程池。

但是实际中从线程池中取线程,完成任务到交回线程这三步骤是比较难以实现的。所以我实际中线程池的实现是通过固定数量的线程,和构建一个线程安全的任务队列。线程池中的线程便不断向任务队列中取出任务来完成,如果不存在需要完成的任务,则阻塞等待。

1.3优点

  • 数据任务可以在任务队列中缓冲,并且数量可以控制,避免了峰值压力下资源耗尽的情况;
  • 避免了数据任务简单时,线程频繁创建和销毁所带来的时间成本。

1.4实现

结合线程池的原理,我们需要:固定数量的线程和线程安全的任务队列,这两项必不可少的构成要素。

我们设计线程入口函数,来使用线程池中的线程不断的从任务队列中取数据进行处理。在设计中我们不关注不同任务的具体处理方法,因为我们将不同任务的不同处理方法写入到线程入口函数中,会造成程序耦合性过高,而且任务处理方法的改变也会设计到线程池中代码的修改。

所以我们不关注任务对应的具体处理方法,而是将其作为参数传递到线程中,让线程来使用该处理方法对任务数据进行错做即可。

总结:我们实现两个类:任务类和线程类。任务类中存在任务的具体内容和任务的处理方法;线程类中存在线程的创建……。

 最后编译并执行得到结果如下:

值得注意的是,在本次代码执行中我们使用了一些C++11中的特性,因此编译过程中的执行语句应该如下(附makefile截图):

2.单例模式

2.1内容

接下来是我们线程应用中的最后一个知识点,叫做单例模式。单例模式也是线程应用中一种典型的设计模型,它的针对场景是:一个类只能实例化一个对象。

这样的设计存在两个出发点:从资源角度而言,资源在内存中只存在一份;从数据角度而言,如果类中只存在一个对象,则无论何时获取到的数据都是一致的。

2.2原理

单例模式的实现我们存在两种实现思想,一种叫做饿汉模式,一种叫做懒汉模式。

对于饿汉模式而言,它会将对象实例化完毕,申请资源完毕,便于可以随时使用资源,是一种以空间换时间的思想。这样做的好坏十分明显,好处是效率最大化,资源使用时可以随意使用;坏处是程序初始化速度慢,占用内存资源较多。

对于懒汉模式而言,它会等到对象需要使用的时候再实例化,资源需要使用时再进行申请,是一种延迟加载的思想。这样做的好坏也很明显,好处是占用内存资源少,程序初始化速度快;坏处是需要访问一个对象时需要去实例化对象加载资源,即第一次访问对象时间较长。

从线程安全的角度而言,饿汉模式并不涉及线程安全问题,因为所有的对象在一开始都会实例化完毕,不存在多个线程同时访问申请资源的情况。但是懒汉模式存在线程安全的问题,因为懒汉模式是使用资源时才实例化对象,如果存在多个线程同时访问同时实例化加载,便会导致线程安全问题的产生。

2.3实现

2.3.1饿汉模式实现

我们可以将对象设计为静态资源,这样便可以在程序初始化阶段完成对象的实例化。

最终编译并执行得到结果如下:

2.3.2懒汉模式实现

我们不直接定义对象,通过定义静态对象指针的方式等待访问时再实例化(new)。

最终编译并执行可得到结果如下:

值得一提的是,在定义_eton数据时,编译器会认为它的访问频率较高,将其直接加载到寄存器之中。这样优化代码之后,我们后续访问到的_eton都只会是空。所以我们可以加上volatile关键字进行修饰,保证内存可见性,防止编译器过度优化。

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

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

相关文章

Web3技术入门向科普

Web3是指下一代互联网,它基于区块链技术,将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念,它包括了很多方面,如数字货币、去中心化应用、智能合约等等。在这篇文章中,我们将重点讨论Web3的入门知识&…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题,把缺陷填补掉,提高亮区面积; 腐蚀用来处理毛刺问题,把毛刺腐蚀掉,降低亮区面积。 腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。 膨胀…

轻松掌握安装k8s官方可视化界面工具知识点

轻松掌握安装k8s官方可视化界面工具知识点 1、安装 1、安装资源 kubernetes官方提供的可视化界面 https://github.com/kubernetes/dashboard 执行以下命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml…

RocketMq集群搭建

各个角色介绍: producer:消息的发送者;举例:发信者consumer:消息的接受者;举例:收信者broker:暂存和传输消息;举例:邮局NameServer:管理Broker&am…

PWM输出实验

实验内容 使用TIM3来产生PWM输出 使用TIM3的通道2,把通道2重映射到PB5.产生PWM来控制DS0的亮度。 PWM简介 脉冲宽度调制(PWM),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种有效方法。 脉冲波…

excle表格打印相关问题

ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 …

Android修改头像之拍照、从相册选择、裁剪

手写一个修改头像的需求,头像图片支持手机拍照裁剪和从相册选择图片裁剪; 实现效果: 本节主要内容: 1)头像修改对话框实现; 2)调用系统相机拍照; 3)自定义图片裁剪页…

centos7 配置LNMP环境

文章目录 LNMP环境的搭建LNMP工作流程FastCGI接口配置LNMP部署环境配置环境测试安装 Discuz LNMP环境的搭建 随着我们 Nginx web 服务器的流行,又出现了我们叫做 LNMP 的一种新的 web 环境服务组合。LNMP 就是 Linux Nginx Mysql PHP 等首字母的缩写。现在&…

STL学习+acwing 67 数字在排序数组中出现的次数

题目链接 67. 数字在排序数组中出现的次数 传统暴力解法 class Solution { public:int getNumberOfK(vector<int>& nums , int k) {int c0;for(int i0;i<nums.size();i){if(nums[i]k)c;}return c;} };容器的应用 set和multiset两个容器有一个count函数 set 为…

eBPF 虚拟机是如何工作的?

eBPF 是一个运行在内核中的虚拟机&#xff0c;很多人在初次接触它时&#xff0c;会把它跟系统虚拟化&#xff08;比如 kvm&#xff09;中的虚拟机弄混。其实&#xff0c;虽然都被称为“虚拟机”&#xff0c;系统虚拟化和 eBPF 虚拟机还是有着本质不同的。 系统虚拟化基于 x86 …

vue 中的事件修饰符介绍+示例说明

vue 中的事件修饰符介绍示例说明 Start 最近使用到 vue 的事件修饰符&#xff0c;发现由于时间太过久远&#xff0c;今天快速的过一下 vue 中的事件修饰符. 1. 官方文档 vue2 v-on 点击这里 vue3 v-on 点击这里 vue2中有关 v-on 的介绍 vue3中有关 v-on 的介绍 初步看下…

Ribbon负载均衡·入门·壹

文章目录 1 Ribbon概述1.1 什么是Ribbon1.2 Ribbon解决的问题1.3 什么是负载均衡 2 SpringCloud与Ribbon2.1 集成Ribbong工具类2.2 单独引入Ribbon 3 Ribbon实现负载均衡源码跟踪3.1 打开LoadBalanced3.2 发现Qualifier3.3 LoadBalancerAutoConfiguration自动装配类 1 Ribbon概…

C++入门(后篇)

&#x1f525;&#x1f525;本章重内容 C入门 1.auto关键字(C11)auto的使用细则auto不能使用的场景 2.基于范围的for循环(C11)3.指针空值nullptr(C11) 1.auto关键字(C11) 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#…

深入了解 Transformers – Part 1: 介绍 Transformer 模型

动动发财的小手&#xff0c;点个赞吧&#xff01; 自从最新的Large Language Models&#xff08;LLaM&#xff09;发布以来&#xff0c;如OpenAI的GPT系列、开源模型Bloom或谷歌发布的LaMDA等&#xff0c;Transformer展现出了巨大的潜力&#xff0c;成为了深度学习的前沿架构楷…

easyexcel内容追加与单元格合并

这里的需求是&#xff0c;如果表格不存在&#xff0c;则新建表格&#xff0c;并填入数据&#xff0c;如果表格存在&#xff0c;那么就追加内容&#xff0c;并且支持单元格合并。 内容追加&#xff0c;需要分两种方式插入&#xff0c;第一种就是没有表格&#xff0c;需要生成表头…

内网渗透之横向移动ipc

0x00 内网横向移动介绍 内网横向移动是什么 在内网渗透中&#xff0c;当攻击者获取到内网某台机器的控制权后&#xff0c;会以被攻陷的主机为跳板&#xff0c;通过收集域内凭证等各种方法&#xff0c;访问域内其他机器&#xff0c;进一步扩大资产范围。通过此类手段&#xff0…

SpringCloud_Eureka服务的注册与发现

文章目录 一、微服务的理论1、微服务和分布式的区别2、微服务的拆分规范和原则 二、微服务的注册与发现(Eureka)1、Spring Cloud Eureka的概念2、构建聚合父工程3、搭建Eureka服务4、搭建Eureka服务的提供者5、创建Eureka服务的消费者 三、Eureka的其他功能1、服务的剔除和自保…

DC-6靶机通关详解

信息收集 漏洞发现 发现无法访问web 加个hosts 这题类似那个dc2还是dc3,网站长的一样 wordPress5.1.1 上wpscan扫 enumrate一下user 看看能不能弱口令 测了wp给的那几个用户,都不能弱口令,dirsearch也没扫到什么有价值的路径 尝试ssh弱口令 没爆出来,回官网看了下描述 确实…

基于药效团的药物设计(Pharmacophore Construction)

基于药效团的药物设计&#xff08;Pharmacophore Construction&#xff09; 药效团模型不仅仅利用分子拓扑学相似性而且利用了基团的功能相似性&#xff0c;从而运用了生物电子等排体&#xff08;bioisosterism&#xff09;的概念使得模型更加可靠。基于药效团的虚拟筛选的方法…

华为OD机试真题(Java),最小步骤数(100%通过+复盘思路)

一、题目描述 一个正整数数组 设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数。 要求&#xff1a; 第一步 必须从第一元素起 且 1<第一步步长<len/2 (len为数组长度)&#xff1b;从第二步开始只能以所…