保护共享资源的方法(互斥锁)

news2024/11/18 20:13:52

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

保护共享资源的方法(锁)

  • 保护共享资源要做到什么
  • 什么是锁
  • 为什么要有锁
  • 锁的创建
  • 锁的初始化
  • 锁的销毁
  • 加锁和解锁
  • 以抢票系统了解锁的使用

保护共享资源要做到什么

我们要保护共享资源,我们其实无外乎做到两点即可。
1).互斥:及同一时间内只有一个执行流访问共享资源。
2).同步:及访问共享资源要有一定的顺序。
满足上述两点,则共享资源就被保护起来了,被称为临界资源。

什么是锁

是完成线程互斥的一种方法,它可以让共享资源在同一时间内,只被一个执行流访问。
锁的底层原理其实相当简单,我们可以将锁想象成一个整数1,只有线程拿到这个整数1,才可以执行后面的代码,否则就阻塞,在执行完后,再把锁还回去。

为什么要有锁

锁是线程进行互斥的常用手段,锁的存在让我们可以保护共享内存,让原本并发执行的线程串行执行,防止出现出乎意料的结果。

锁的创建

锁的创建其实是一个原生线程库的内置类型。

pthread_mutex_t
这就是锁类型,我们在对这个类型初始化就得到了一把锁。
要注意,如果锁是局部的,则需要使用初始化接口,如果是全局的锁,则可以使用宏PTHREAD_MUTEX_INITIALIZER来初始化。
在这里插入图片描述

锁的初始化

全局锁,使用宏初始化,局部锁,使用接口初始化。

pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

参数1:代表初始化那个锁,要传入一个指针。
参数2:设置锁的属性,传入nullptr为默认属性。

在这里插入图片描述

锁的销毁

不论是全局锁还是局部锁,都需要使用接口销毁。

pthread_mutex_destroy(pthread_mutex_t *mutex)

参数1:直接指定某个锁,销毁

在这里插入图片描述

加锁和解锁

给某个线程加锁,只需要在该线程中对临界区加锁,保护共享资源就是保护访问共享资源的代码
加锁解锁要注意以下几点
1).加锁和解锁要尽量细致。
2).加锁后,加锁的部分可以视为“原子操作”
3).加锁后要注意解锁,不然多线程可能导致死锁问题

pthread_mutex_lock(pthread_mutex_t *mutex)

参数1:代表该线程加那把锁。

pthread_mutex_unlock(pthread_mutex_t *mutex)

参数1:代表该线程解那把锁

以抢票系统了解锁的使用

在这里插入图片描述

抢票逻辑中,票数是共享资源,我们的每个线程都需要一直抢票,但是对于抢票逻辑我们需要加锁,因为对共享资源的操作不是原子的,可能导致不可知的后果。

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

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

相关文章

一个基于vue、nuxt.js的网盘搜索项目,且持续开源和维护;目的实现人人都可以拥有自己的网盘搜索网站;

一个基于vue、nuxt.js的网盘搜索项目,且持续开源和维护;目的实现人人都可以拥有自己的网盘搜索网站; 🌐Github地址 https://github.com/unilei/aipan-netdisk-search 🌐在线体验 https://so.aicompasspro.com/

我在去哪儿薅到了5块钱火车票代金券,速薅

哈哈,亲爱的薅羊毛小伙伴们! 刚刚在去哪儿大佬那儿发现了一个超级薅羊毛福利!我只花了短短两分钟,就搞到了一张5块钱火车票代金券,简直是天上掉馅饼的节奏啊! 话不多说,薅羊毛的姿势给你们摆好…

202473读书笔记|《但愿呼我的名为旅人:松尾芭蕉俳句300》——围炉夜话,身顿心安,愿每个人都能在爱里自由驰骋

202473读书笔记|《但愿呼我的名为旅人:松尾芭蕉俳句300》——围炉夜话,身顿心安,愿每个人都能在爱里自由驰骋 😍😍🤩🤩 译者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名为旅人&…

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结 本章知识点基于模型的强化学习与无模型的强化学习方法简介无模型的强化学习方法基于模型的强化学习方法 强化学习算法的评价指标Dyna-Q算法Dyna-Q 算法的具体流程Dyna-Q 代码实践 本章知识点 基于模型的强化学习与无模型的强…

前端 CSS 经典:好看的标题动画

前言&#xff1a;好看的标题动画实现。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

syncthing文件夹同步与版本管理

1 前言 syncthing可以用来同步文件夹里的所有文件&#xff0c;并且有不错的版本管理&#xff0c;基本每次更改文件&#xff0c;20-40秒就被扫描到了&#xff0c;非常丝滑&#xff1b;这次以此来同步obsidian的插件和文件&#xff0c;达到多端同步&#xff1b; 我家里有一台台…

自定义横向思维导图,横向组织架构图,横向树图。可以自定义节点颜色,样式,还可以导出为图片

最近公司设计要求根据目录结构&#xff0c;横向展示。所以做了一个横向的思维导图&#xff0c;横向的树结构&#xff0c;横向的组织架构图&#xff0c;可以自定义节点颜色&#xff0c;样式&#xff0c;还可以导出为图片 话不多说&#xff0c;直接上图片&#xff0c;这个就是一…

Django自定义命令

Django自定义命令 我们知道&#xff0c;Django内部内置了很多命令&#xff0c;例如 python manage.py runserver python manage.py makemigrations python manage.py migrate我们可以在python控制台中查看所有命令 我们也可以自定义命令&#xff0c;让python manage.py执行…

如何使用甘特图来做任务管理?zz-plan甘特图的实践指南

在项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具&#xff0c;它可以帮助团队成员清晰地规划、执行和跟踪项目进度。然而&#xff0c;如何有效利用甘特图进行任务管理&#xff0c;对于许多团队来说仍然是一个挑战。本文将结合 zz-plan https://zz-plan.com/ 甘特…

彻底搞懂JavaScript原型和原型链

基于原型编程 在面向对象的编程语言中&#xff0c;类和对象的关系是铸模和铸件的关系&#xff0c;对象总是从类创建而来&#xff0c;比如Java中&#xff0c;必须先创建类再基于类实例化对象。 而在基于原型编程的思想中&#xff0c;类并不是必须的&#xff0c;对象都是通过克隆…

Unity数据持久化2——XML

简介&#xff1a; 基础知识 XML文件格式 XML基本语法 XML属性 练习&#xff1a; C#读取存储XML XML文件存放位置 读取XML文件 练习&#xff1a; 存储修改XML文件 练习&#xff1a; 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

【python】python社交交友平台系统设计与实现(源码+数据库)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python安装路径可以更改吗

Python3.5默认安装路径是当前用户的 AppData\.. 下 现在安装过程中默认是install just for me&#xff0c;这个会把python默认安装到AppData文件夹中&#xff0c;如果选了install for all users&#xff0c;就会默认安装到C盘根目录了。 python3.5 安装&#xff1a; 输入官网…

机器学习入门-sklearn

概述 机器学习定义是什么&#xff1f; 官方定义&#xff1a; 机器学习是人工智能核心&#xff0c;是使计算机具有智能的根本途径。&#xff08;地位&#xff09; 机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff08;研究内容&#xff09;&#xff0c;以获取新的…

PyCharm控制台中文乱码,输出�¹���

问题&#xff1a;很离谱的一件事就是python控制台可以正常的输出中文&#xff0c;但在pycharm控制台中就是乱码。 解决方法&#xff1a;之前看他们一些文章说设置pycharm的文件编码&#xff0c;不管怎么改都没用。 只是设置第一张图中的内容无效 好了&#xff0c;打完收工~

uview1.0 u-form表单回显校验不通过

提交到后端的数据&#xff0c;回显后不做任何修改无法通过表单校验 原因&#xff0c;u-form表单校验的类型默认为string&#xff0c;但是后端返回的是integer类型&#xff0c;导致无法通过校验 解决&#xff0c;既然后端返回的是整数形&#xff0c;那么我们就将校验规则的type…

有没有软件可以监控电脑软件?监控电脑软件的系统

有没有软件可以监控电脑软件&#xff1f;监控电脑软件的系统 电脑软件如果不合规也会给企业带来安全危害&#xff0c;比如盗版软件&#xff0c;比如游戏软件耽误工作等&#xff0c;所以需要对电脑软件的监控。下面我将详细介绍几款代表性的电脑监控软件及其功能&#xff0c;帮…

vscode添加代办相关插件,提高开发效率

这里写目录标题 前言插件添加添加TODO Highlight安装TODO Highlight在项目中自定义需要高亮显示的关键字 TODO Tree安装TODO Tree插件 单行注释快捷键 前言 在前端开发中&#xff0c;我们经常会遇到一些未完成、有问题或需要修复的部分&#xff0c;但又暂时未完成或未确定如何处…

树的非递归遍历(层序)

层序是采用队列的方式来遍历的 就比如说上面这颗树 他层序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…