「并发编程 」

news2024/12/23 5:41:37

一、 为什么会有线程安全问题

1)程序和CPU间的协作关系

  • CPU组成
    • 寄存器
      • 存储了从内存加载的数据(从内存中将数据加载到 L1,L2,L3 缓存,再到寄存器) ;
      • 寄存器的运行速度比内存快好多个级别;
      • 所编写的程序在计算机底层转换为汇编语言后,主要操控对象是寄存器;
      • 按存储数据分类
        • 内存地址类寄存器
          • 程序计数器、基址寄存器,变址寄存器
        • 非内存地址寄存器
          • 累加寄存器,通用寄存器,标志寄存器

i ++ 问题:

多个线程同时使用i++指令的时候就可能会出现如下图的冲突,不同线程在执行的时候,各自的 eax 累加寄存器中的数值不相同,从而导致最终i被两次更新,但值却不是 2。

解决此类问题:只需要保证每个线程在执行i++ 指令的时候都是一个原子操作即可,例如通过加入一道屏障指令;
当线程 a 将变量读取到寄存器中,就给变量加一道屏障;

信号量

1)是什么:信号量其实是一种设计思想,它的本质可以理解为是一个整形的数字(sem),对于这个数字的访问,在具体实现上只提供两个原子操作

1)共享资源块是指被多个线程或进程共同访问和操作的一段代码或数据区域

2)原理(为什么)
p():prolaag 减少,又称为 wait 或 down 操作;主要作用是对信号量的计数器 -1(即 sem - 1 操作),如果计数器值为 0,则线程将被阻塞,后续的请求会被放置到一条等待队列中;当有请求抵达灵界区时,会触发 p 操作;
v():verhoog 增加,又称为signal操作或up操作;主要作用是对信号量的计数器进行 +1(即 sem + 1 操作),如果存在被阻塞的线程,则唤醒其中一个线程;
其中,计数器初始化值为信号量的初始资源数目;随着之前在临界区的访问处理结束后,就会触发一次 v 操作,然后从等待队列的队头通知一个之前处于等待状态的请求,让其进入临界区;

3)如何使用
1、多进程间任务执行的先后顺序
A 进程的 method_3 需要在 B 进程执行 method_2 后运行:保证在执行 A 进程 method_3 之前都执行 B 进程的 method_2 -> 执行 method_3 时需要借助 B 进程发起 V 操作;

2、多进程间任务的前驱关系

3、通过信号量实现访问次数限制

管程

  • 英文名字:monitor(监视器)
  • 对信号量的基础做一层封装;专用于访问一些共享变量的函数,使调用方使用起来更加简单和清晰;作用为一次只允许一个线程访问临界区
  • 什么临界区:临界区(Critical Section)是访问共享资源时的一段代码区域

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

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

相关文章

哈工大开源“活字”对话大模型

一、介绍 大规模语言模型(LLM)在自然语言处理的通用领域已取得了令人瞩目的成功。对于广泛的应用场景,这种技术展示了强大的潜力,学术界和工业界的兴趣也持续升温。哈工大自然语言处理研究所30余位老师和学生参与开发了通用对话大…

【BUG】docker安装nacos,浏览器却无法访问到页面

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

单链表相关操作(插入,删除,查找)

通过上一节我们知道顺序表的优点: 可随机存储(O(1)):查找速度快 存储密度高:每个结点只存放数据元素,而单链表除了存放数据元素之外,还需存储指向下一个节点的指针 http://t.csdn.cn/p7OQf …

计算机组成原理之浮点运算

1、浮点运算步骤 ①0操作数的检查,看有无简化操作的可能。 ②比较阶码大小并完成对阶(小阶向大阶对齐)。 ③尾数进行加或减运算。 (在进行尾数加减前,浮点运算器会自动把原码形式的尾数转换成补码形式。) ④…

像素相关知识

物理像素 指的是物理设备上真实的小方块个数,就是拿放大镜看屏幕时看到的像素点, 每个物理像素具体的大小是不固定的,不同设备不相同,由厂家设置 逻辑像素 指的就是我们css用到的px这个单位的像素 像素比(DPR&…

GB/GMP法规内容对沉降​菌、浮游菌监测​点设置相关规定及要求详解

微生物鉴定一直是生物、食品、医药等领域非常重要的监控指标,可以帮助预测药品生产过程以及无菌生产环境的风险。对于许多企业而言,建立厂房环境微生物菌种库对于微生物污染控制来说非常关键,环境菌种库的建立可以帮助制定洁净区消毒灭菌程序…

Leetcode40 组合之和2

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 解题思路:回溯剪枝 代码&#xff…

LeetCode--HOT100题(31)

目录 题目描述:25. K 个一组翻转链表(困难)题目接口解题思路代码 PS: 题目描述:25. K 个一组翻转链表(困难) 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表…

麦肯锡重磅发布2023年15项技术趋势,生成式AI首次入选,选对了就是风口

两位朋友在不同群里分享了同一份深度报告。 一位是LH美女,她在“AIGC时代”群里上传了这份文档,响应寥寥,可能是因为这些报告没有像八卦文那样容易带来冲击。 你看韩彬的这篇《金融妲己:基金公司女销售的瓜,一个比一个…

Ingress企业实战:金丝雀与蓝绿发布篇

背景 现如今,越来越多的应用采用了微服务架构,这也导致了应用数量相比传统模式更多,管理更加复杂,发布更加频繁,如果直接将新版本上线发布给全部用户。一旦遇到线上事故(或BUG),对用…

哪些客户适合打Cold Call?

都知道Cold Call是外贸营销中一种重要的销售方式,相比邮件跟进,它可以可实时交流,获取需求,解决问题,展示人情味,提升好感度,提高转化率。但由于陌生性,当下如果没有需求的话&#x…

“万恶”之源的KieServices,获取代码就一行,表面代码越少里面东西就越多,本以为就是个简单的工厂方法,没想到里面弯弯绕绕这么多东西

Drools用户手册看了得有一段时间了,现在开始看源码了,因为每次使用drools都会看见这么一段代码: 代码段1 起手代码 KieServices ks KieServices.Factory.get(); 那我就从这段代码出发开始研究drools的源码吧,这么一小段代码起初…

文件操作/IO

文件 文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问…

代码运行出现:No module named ‘torch_geometric‘

这是没有torch_geometric库导致的,但是不能像一般库安装‘pip install 库名’或者‘conda install 库名’进行安装,经常会报错!!! 需要先安装四个小部件再安装torch_geometric,具体安装步骤如下: step 1:查看自己环境…

简约时尚的健康手表,智能守护每一刻,dido Y60上手

智能手表是现在很流行的一种智能设备,很多品牌都推出了各种各样的产品,但是大部分都更侧重功能和运动的方面,健康监测往往只是配角,而随着人们对自己的健康越来越重视,有些朋友只是单纯的需要一块专业的健康监测手表。…

SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配

介绍 人类通过记忆和理解来识别物体、人和图像。你看到某件事的次数越多,你就越容易记住它。此外,每当一个图像在你的脑海中弹出时,它就会将该项目或图像与一堆相关的图像或事物联系起来。如果我告诉你我们可以使用一种称为 SIFT 算法的技术来教机器做同样的事情呢? 尽管…

部署私有知识库项目FastGPT

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。 项目源码: GitHub - c121914yu/FastGPT: A platform that uses the Open…

【推荐】7个可以改变我们在3dMax中工作方式的插件

​以下给大家介绍的这些插件,将改变我们在3d Max中的工作方式,让生活更加轻松。 Glue Utility(粘合实用程序) 这些年来,这个工具改变了我的游戏规则。它使我能够执行许多任务,否则这些任务要么是不可能…

在矩池云使用 ChatGLM2-6B ptuning

本文参考 ChatGLM2-6B 官方文档,在矩池云复现了对于 ChatGLM2-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。 官方文档地址…

一百五十六、Kettle——Linux上安装的Kettle9.3连接ClickHouse数据库(亲测,附流程截图)

一、目标 kettle9.3在Linux上安装好后,需要与ClickHouse数据库建立连接 二、前提准备 (一)在Linux已经安装好kettle并可以启动kettle (二)已知kettle和ClickHouse版本 1、kettle版本是9.3 2、ClickHouse版本是21…