多线程与并发思想

news2024/9/8 23:37:29

问题分析

设计并发程序的目的就是为了使程序运行得更快(时间就是金钱、生命),提高软件的性能。并发程序之所以能快,就在于这个“并”字,因为程序能并发(单核)或并行(多核、多CPU)执行,当然能快。这就好比工人搬砖块,人当然是越多越快。但是,这之中有个关键问题,大家是否想到,那就是这个事情(如搬砖块)是否可以并发或并行来做。

例如每个人乘车去上班这件事就没法并发来做,因为从起点到终点,公交车只能是一站一站到达,同一辆车不可能同时达到几个站,也不可能给你增加几台公交车(多核,多线程),你的乘车时间因此减少了,所以这个时候,给你再多的车(增加CPU或核心数),你的乘车时间也不会减少(程序性能提高不了),因此这个时候,你只能希望汽车跑得更快(提高单个CPU或核心的运算速度),这样才能达到减少时间提高程序性能的目的。这就说明了,并发程序设计的一个本质问题,就是首先要分析问题能不能让程序去并发或并行执行?如果这个问题(乘公交车上班)本身就只能串行去做,那么您就不用考虑使用并发编程技术了,因为这不但不能提高效率反而会使程序开发变得更加复杂,得不偿失。

在确定需要使用并发编程技术来解决问题后,我们应该进一步分解问题,其实现实世界中广泛存在两类可以并发处理的问题场景:一种是可以完全并发或并行(如访问网站,银行窗口办业务等),这当然是绝佳的并发编程应用场景;还有一种则是总体需要串行,但中间有些步骤可以并发执行(事实上所有能并发处理的问题都是这种类型,只是看具体问题规模及分解情况),这个时候就需要处理依赖(前置步骤)与等待(同步)问题,最终按顺序完成。所以我们需要把问题进行逐步分解,以便最大化利用并发编程的优势

引入并发程序解决问题时,目的是为了加快程序运行速度,减少时间。但是你肯定想知道快了多少,是否达到你的预期。这个数据不难得出,只要在同等条件下,把并发之前与之后的程序运行时间对照一下就能看出来。通常人们把程序优化之前运行时间与优化之后的时间的比值称之程序加速比。它是用来衡量程序优化效果的一个关键参数。
              程序加速比 = 优化前耗时 / 优化后耗时

由此,我们引入计算机科学中非常重要的定律——Amdahl定律。它定义了串行系统并行化后加速比的计算公式与理论上限,并给出了加速比与系统并行程度和处理器(CPU)数量的关系。设加速比为Speedup,系统内必须串行化的部分比重为F ,CPU数量为N ,则有公式:
            

img-amdahl

当处理器(CPU)的数量N 趋于无穷大时,Speedup 的最大值无限趋近1/F ,那么加速比与系统的串行化率成反比。这意味着如果程序中有50%(F)的处理都需要串行进行的话,Speedup 只能提升2倍;如果程序中有10%(F)需要串行进行,Speedup 最多能够提高近10倍。
Amdahl定律同时量化了串行化的效率开销。在拥有10个处理器的系统中,程序如果有10%是串行化的,那么最多可以加速5.3倍(53%的使用率),在拥有100个处理器的系统中,这个数字可以达到9.2(92%的使用率)。即使有无限多个CPU(N),程序加速比也不可能为10。 

根据Amdahl定律,使用并发编程技术解决问题时,系统运行速度的快慢主要取决于CPU或核心的数量及系统中串行化程序的比重。CPU或核心数量越多,串行化比重越低,则系统运行速度越快。仅提高CPU或核心数量而不降低系统串行化程序的比重,也是无法加快系统的运行速度,提高系统的性能

线程数和任务数

共享可变性

 你可能会想“只要把任务进行分解并分派到多个线程中执行,程序就能获得更高的吞吐量”。但遗憾的是,绝大多数问题都无法被分解为彼此完全独立的几个子问题。更普遍的情况是,我们可以独立地执行某些操作,但最终还是需要将这些操作所得到的部分结果进行归并才能得到完整的结果。所以线程之间需要能够相互交换彼此的数据,并且有时候某些线程还需要等待其他线程的结果出来之后才能继续运行。于是我们就需要在线程之间进行协调,并由此引出同步和锁等一系列令人头痛的问题。在开发并发应用程序的时候,我们通常会遇到3类问题:饥饿、死锁以及竞争条件,这三类问题都与线程同步及锁有很大的关系,其中前两个问题还算比较易于检测甚至避免,而竞争条件则是一个需要彻底根除的棘手问题(因为它是很容易让并发程序产生bug,而且很多时候很难跟踪与调试)。

共享可变性方法,也是我们常用的方法,我们创建的变量允许所有线程修改,当然是在一个可控的模式下。使用共享可变性来进行编程虽然看似简单,但却可能会导致同步问题。为了使用共享可变性,我们必须保证不会有两个线程同时修改同一个字段,并且对多个字段的修改必须满足一致性原则,因为这样写出来的程序在同步方面太容易出错了。

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

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

相关文章

修改linux服务器上的mariadb/mysql数据库的密码

文章目录 一、查看数据库的状态二、修改密码 可能我们在最初安装数据库时没有设置密码或者已经设置了但是又想修改另一个密码,可以这样操作来修改我们的密码。 以数据库 mariadb 为例。 一、查看数据库的状态 使用命令 systemctl is-active mariadb 查看当前数据库…

链表篇-02.从尾到头打印链表(反转链表)

解题思路: 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置,第二个指针(cur)指向头节点, 然后依次往后执行,第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

Linux云计算 |【第二阶段】AUTOMATION-DAY5

主要内容: YAML语法格式,层级关系、Ansible Playbook文件及语法格式、Ansible变量(定义变量方法、优先级顺序、setup和debug查看变量) 补充:Ansible ad-hoc 可以通过命令行形式远程管理其他主机,适合执行一…

python学习笔记——字符串

一、创建字符串 1.我们可以使用引号( 或 " )来创建字符串。创建字符串很简单,只要为变量分配一个值即可。 var1 Hello World! var2 "Runoob" 二、访问字符串中的值 1.Python 访问子字符串,可以使用方括号 [] 来截取字符串。…

RocketMQ的Admin Tool工具

文档:https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md写的很全面,我写了一半就偷懒了,地址放这里。 命令大全:https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md 1. 删除讨厌的告警…

VUE3——003、VUE 项目中的文件结构(index.html、main.ts、App.vue)

虽然是号称是小白初学,但本文只是对 VUE 小白,其它的基功还是有一丢丢的,不太懂的同学去看看一下详解,我这里记述的是自己的理解和观点。见谅! index.html:入口文件(以创建 vue3 项目的默认文件…

springboot+vue+mybatis线上选课系统+PPT+论文+讲解+售后

在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对学生选课信息管理的提升,也…

顺序表的代码实现

顺序表的代码实现 1.认识什么是顺序表1.1顺序表的优缺点 2.实现顺序表代码准备3.顺序表的代码实现3.1 顺序表结构体的定义3.2 顺序表的初始化3.3 顺序表的销毁3.4 顺序表的输出打印3.5顺序表的扩容3.6 顺序表的头部插入(头插)3.7 顺序表的头部删除(头删)3.8 顺序表的尾部插入(尾…

会话存储、本地存储,路由导航守卫、web会话跟踪、JWT生成token、axios请求拦截、响应拦截

1、会话存储、本地存储 前端浏览器中存储用户信息,会话存储、本地存储、cookie 会话存储(sessionStorage):会话期间存储,关闭浏览器后,数据就会销毁 sessionStorage.setItem("account",resp.d…

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 📕Play To Device 软件升级 ht…

科学设计程序员面试内容,破解“八股文”之弊

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…

数据结构之线性表(顺序表的实现)

目录 一、线性表的原理 二、线性表的实现(顺序表) 1.定义顺序表 2.初始化顺序表 3.判断顺序表是否为空 4.获取顺序表的长度 5.向顺序表中插入元素 6.删除指定位置的元素 7.遍历顺序表 8.得到指定位置的元素 三、打印测试功能 1.测试 2.结果…

【Ant Design Vue的更新日志】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 以下是Ant Design Vue的更新日志 版本1.7.0(发布日期:2023年4月) …

python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(lambda)的使用)(12)

文章目录 前言1、列表、字典生成式2、递归函数2.1 python中代码的递归深度(扩展) 3、拓展:迭代器和生成器3.1 迭代器(iter)3.2 生成器(yield) 4、匿名函数(lambda)4.1 ma…

康师傅JAVA核心内容

链接:康师傅JAVA核心内容 (qq.com)

LeetCode刷题笔记第682题:棒球比赛

LeetCode刷题笔记第682题:棒球比赛 题目: 想法: 遍历输入的列表,按照规则将分数和操作依次进行,存储在新建的列表中,最终输出列表中的元素和,代码如下: class Solution:def calPo…

Ubuntu、centos、openEuler安装docker

目录 1.在 Ubuntu 上安装 Docker 1. 1 更新软件包 1. 2 安装必要的依赖 1.3 添加 Docker 的 GPG 密钥 1.4 添加 Docker 仓库 1.5 更新软件包 1.6 安装 Docker 1.7 启动并启用 Docker 服务 1.8 验证安装 1.9 运行测试容器 1.10 非 root 用户运行 Docker 2.在 CentOS…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求,并确保所有请求都能正确处理并报告其状态。 假设有一个场景:有一个任务列表,有单个任务的处理功能…

OpenGL学习 1

一些唠叨: 很多时候,都被Live2d吸引,去年想给网页加个live2d看板娘,结果看不懂live2d官方给的SDK,放弃了。今天又想弄个live2d桌宠,都已经在网上找到Python 的 Live2D 拓展库了,并提供了用QT实现…