linux(线程同步和互斥)

news2024/11/27 19:52:47

目录:

        1.为什么需要同步和互斥

       2.明确一些概念

       3.实现一个抢票程序

       4.理解加锁和解锁是原子的呢??

-------------------------------------------------------------------------------------------------------------------------

1.为什么需要同步和互斥

 2.明确一些概念

 ------------------------------------------------------------------------------------------------------------------------

3.实现一个抢票系统

我们先简单的创建线程操作

 我们要实现一个抢票逻辑

我们再来看看实现的效果

 现在tickets就是临界资源,这个临界资源不是安全的,为什么不是安全的呢??

 tickets--并非原子的

对临界区进行加锁

pthread_mutex_init

 如果这把锁你不想用了你可以释放掉

pthread_mutex_destroy

 pthread_mutex_lock   加锁

 

 

此时我们就写出来了安全的抢票机制

 4.理解加锁和解锁是原子的呢??

申请锁和释放锁本身就是原子的!!!

一行代码是代码是原子的:只要你一行代码经过编译,只有一行汇编的代码是原子的!!!

 那么互斥锁是怎么做到的呢??

实现互斥锁,大多数体系结构都提供了swap和exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于一条指令,保证原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期

提供了swap和exchange指令的目的是:用一条汇编,完成内存和CPU内寄存器数据的交换!!

 这就是为什么申请锁是原子的原理了

mutex的本质其实是通过一条汇编,将锁数据交换到自己的上下文中!!!!

 那么我们现在有一个问题了!!

我们A在竞争锁成功之后,在加锁和解锁的过程中,有没有可能被切走呢??

 

 

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

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

相关文章

哈工大计算机网络传输层详解之:流水线机制与滑动窗口协议

哈工大计算机网络传输层详解之:流水线机制与滑动窗口协议 在上一节中我们逐步分析了可靠传输协议的设计过程,最后讲到rdt3.0的设计和实现机制。但是rdt3.0为了实现可靠性,牺牲了很大一部分性能,其中最主要的原因就在于停止等待协…

23.ELman神经网络预测数据

1.简述 学习目标:ELman神经网络预测数据 Elman网络介绍 神经网络是一个庞大的体系和概念,根据处理信息的不同方式来区分不同的network。比如根据处理信息结果的传递方向,分前馈型与反馈型。前馈型网络会根据输出数值来调整网络的参数&#xf…

LangChain 中文入门教程

为了便于阅读,已生成gitbook:LangChain 中文入门教程 - LangChain 的中文入门教程 github地址:https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide 加了个 CHANGELOG,更新了新的内容我会写在这里,方便之前看…

2023-06-19 Untiy进阶 C#知识补充2——C#版本与Unity的关系

文章目录 一、Unity 与 C# 版本二、Unity 的 .Net API 兼容级别 一、Unity 与 C# 版本 Unity 版本C# 版本Unity 2021.2C# 9Unity 2020.3C# 8Unity 2019.4C# 7.3Unity 2017C# 6Unity 5.5C# 4 ​ 更多信息可以在 Unity 官网说明查看:Unity - Manual: C# compiler (u…

Git的使用方法

文章目录 Git简介Git用法上传到gitee上 Git简介 简单来说,Git就像一个日志一样,可以帮你记录你对文本文件的修改,但他的功能又强于日志,不仅可以记录,还可以帮你存储那些你对文本文件的修改,当你想要找回之…

C++基础入门教程(1)

1 C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具,我们先将它打开 1.1.2 创建文件 右键源文件,选择添加->新建项 给C文件起个名称&am…

亲测有效:自定义下拉头部刷新控件,任何子View都可以下拉

对于一个主Activity,里面进行多个fragment切换,不知其fragment包裹的是什么控件,但是都要进行下拉刷新,比如下拉切换语言、切换主题等场景。常见的方法,每个fragment里面都单独加下拉刷新;现在是自定义下拉…

Databend 开源周报 第 97 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 列位置 Databe…

MongoDB 数据库管理系统

MongoDB是一个非关系型数据库管理系统,它使用文档模型存储数据。MongoDB中的文档类似于JSON对象,可以包含键值对和嵌套文档。MongoDB提供了强大的查询语言、聚合框架、索引和直接在数据存储中运行的计算。 MongoDB被广泛应用于许多领域,特别…

React 组件生命周期

组件的生命周期可分成三个状态: Mounting(挂载):已插入真实 DOMUpdating(更新):正在被重新渲染Unmounting(卸载):已移出真实 DOM Mounting 挂载阶段 Mounting阶段叫挂载阶段,伴随整个虚拟DOM的声明。它里面有四个小的…

Altium Designer软件点击没有反应?如何解决?

对电子工程师来说,Altium Designer(AD)是一款功能强大的PCB设计软件,被广泛应用在电子工程领域。然而在使用过程中可能会遇见AD软件点击没有反应的情况,面对这个问题该如何解决?下面来看看吧! 1…

公网访问Linux CentOS本地搭建的Web站点

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章:Linux CentOS本地搭建…

videojs-player视频播放技术学习

介绍: videojs是一个开源的HTML5视频播放器,它可以在各种设备和浏览器上播放视频。videojs提供了丰富的API和插件,可以实现自定义的视频播放功能。 使用videojs实现视频播放的步骤: 1. 引入videojs库 在HTML文件中引入videojs库…

chatgpt赋能python:Python打开文件路径:一种更轻松的办法

Python打开文件路径: 一种更轻松的办法 在Python编程中,打开文件路径是非常常见的任务。然而,对于许多初学者,Python打开文件路径时可能会面临一些问题和困难。本篇文章将介绍Python打开文件路径的方法,并给出一种更加轻松的解决…

5-垃圾回收

目录 1.死亡对象的判断算法 1.1.引用计数算法 1.2.可达性分析算法(主流) PS:强引用、软引用、弱引用、虚引用 2.垃圾回收算法 2.1.标记-清除算法 2.2.复制算法 2.3.标记-整理算法 2.4.分代算法(主流) PS&…

达梦体系结构

物理结构、逻辑结构、实例(内存结构、进程结构) 一、物理结构 配置文件、控制文件、数据文件、重做日志文件、归档日志文件、备份文件、跟踪日志文件、事件日志文件 (一)配置文件 以.ini结尾的文件,例如dm.ini (相…

chatgpt赋能python:Python打包成so文件的方法:详解

Python打包成so文件的方法:详解 Python是一种灵活且易于使用的高级编程语言,由于其强大的效率和易于上手的特性,在最近几年已经迅速地流行起来。Python支持多种开发范式,例如函数式编程、面向对象编程和脚本编程。 Python的这些…

【UCOS-III】自我学习笔记→第20讲→时间片调度

文章目录 前言实验步骤1.复制任务创建和删除工程文件并删除task3任务,修改任务1和任务2的优先级为22.修改任务1和任务2的内容3.查看示波器现象 测试代码工程文件总结 前言 无,仅作记录,不具有参考价值,所用开发板为STM32F411RET6…

chatgpt赋能python:Python如何打开电脑摄像头

Python如何打开电脑摄像头 Python是一种易于学习和使用的编程语言,因其灵活性和强大的功能而备受欢迎。其中,许多人使用Python来处理图像处理和计算机视觉,这样,了解如何打开电脑摄像头是非常重要的。 在这篇文章中,…

【高危】crypto-js<3.2.1 存在不安全的随机性漏洞

漏洞描述 crypto-js 是一个 JavaScript 加密库,用于在浏览器和 Node.js 环境中执行加密和解密操作。 crypto-js 3.2.1 之前版本中的 secureRandom 函数通过将字符串 0. 和三位随机整数拼接的格式生成加密字符串,攻击者可通过爆破破解加密字符。 漏洞…