线程间同步的方式有哪些?

news/2024/9/19 1:09:09/ 标签: java

Linux 系统提供了五种用于线程间同步的方式:互斥锁、读写锁、自旋锁、信号量、条件变量

互斥锁

主要用于保护共享数据,确保同一时间内只有一个线程访问数据。

互斥量本质上来说就是一把锁,在访问共享资源前对互斥量进行加锁,访问完成后对释放互斥量,也就是解锁。

对互斥量进行加锁之后,任何其试图再次对互斥量加锁的线程都会被阻塞知道当前线程释放该互斥锁。

这样就能保证每次只有一个线程可以向前执行了。

在这里插入图片描述

读写锁

读写锁也叫做 共享互斥锁

他有三种状态:

读模式下加锁状态、写模式下加锁状态、不加锁状态。

一次只能有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。

因此与互斥量相比,读写锁允许更高的并行性。

读写锁非常适合对数据结构读的次数远大于写的情况。

在这里插入图片描述

自旋锁

自旋锁是一种忙等待锁,不是通过休眠使进程阻塞的,而是在获取锁之前一直处于忙等待(自旋)的阻塞状态。

自旋锁可用于以下情况:

锁被持有的时间短,而且线程并不希望在重新调度上花费太多的成本。

自旋锁用在非抢占式内核中时是非常有用的,除了提供互斥机制以外,还可以阻塞中断,这样中断处理程序就不会陷入死锁状态

在这里插入图片描述

信号量

线程的信号量和进程的信号量类似,使用线程的信号量可以高效地完成基于线程的资源计数。

信号量实际上是一个非负的整数计数器,用来实现对公共资源的控制。在访问前进行申请资源(P 操作)和在访问结束后进行释放资源(V 操作),以确保资源的正确使用

在公共资源增加的时候,信号量就增加;公共资源减少的时候,信号量就减少,只有当信号量大于 0 的时候,才能访问信号量所代表的公共资源。

在这里插入图片描述

条件变量

条件变量是线程可用的另一种同步机制。

条件变量给多个线程提供了一个会和的场所。

条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生,条件变量本身由互斥量保护。

线程在改变条件状态之前必须首先锁住互斥量。

其他线程在获得互斥量之前不会察觉到这种改变,因此互斥量必须在锁住以后才能计算条件。

总结

Linux 系统提供了五种用于线程间同步的方式:

互斥锁、读写锁、信号量、自旋锁、条件变量

  • 互斥锁:用于保护共享变量,确保同一时间只有一个线程可以访问该资源,只有获得互斥锁的线程才能进入临界区,其他线程需要等待锁的释放
  • 读写锁:也称为 共享-独占锁,允许多个线程同时读取共享资源,但在写操作时需要独占访问,读写锁在读多写少的场景中可以提供更好的并发性能
  • 信号量:用于控制对一组资源的访问。信号量允许多个线程同时访问资源,但是需要在访问前进行申请资源(P 操作)和在访问结束后进行释放资源(V 操作),以确保资源的正确使用
  • 自旋锁:是一种忙等待锁,在获取锁之前,线程会一直尝试获取锁,而不会进入睡眠状态。自旋锁适用于锁占用时间短暂、保护临界区较小的情况
  • 条件变量:用于在线程之间进行条件同步。一个线程可以等待某个条件满足,而另一个线程在满足条件时可以通知等待线程继续执行

http://www.ppmy.cn/news/1519849.html

相关文章

编程学习方法——感悟分享

编程的确是一条充满挑战的道路,每个开发者都可能在这条路上遇到挫折。面对Bug的迷宫和复杂算法,以下是一些我用来克服困难的策略,希望能为你的编程之路提供帮助。 1. 分解问题 复杂的算法和Bug往往显得难以捉摸。将问题分解成小块&#xff…

vue3手动写一个图片懒加载的插件

关于图片懒加载,网上自然是有许多形形色色的成品的,但是现在我们自己来实现一个图片懒加载的功能 实现原理: 主要利用了js提供的一个新方法,IntersectionObserver用于监听元素是否在页面可视区域, 用法: C…

Navicat连接Mongodb成功了,但是无法显示数据库怎么办?

不知道你是否遇到过?Navicat连接Mongodb成功了,但是无法显示数据库怎么办? 解决办法 这个问题比较坑,对于第一次接触的小伙伴,可能会一脸懵逼,原因就是在Navicat中默认会不显示隐藏的项目,如果不…

【项目日记】高并发内存池---实现线程缓存

比起那些用大嗓门企图压制世界的人, 让全世界都安静下来听你小声说话的人更可畏。 --- 韩寒 《告白与告别》--- 高并发内存池项目---实现线程缓存 1 框架设计2 自由链表类和哈希规则2.1 自由链表类2.2 映射规则 3 实现线程缓存3.1 申请内存3.2 释放内存 4 多线程…

局部整体(五)利用python绘制旭日图

局部整体(五)利用python绘制旭日图 旭日图( Sunburst Charts)简介 由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个…

FastAPI 进阶:使用 Pydantic 验证器增强 Query 参数验证

在 FastAPI 中,为 Query 类参数添加更复杂的验证逻辑可以通过以下几种方法实现: 使用 Pydantic 验证器: Pydantic 允许你在模型中定义自定义验证器。这些验证器可以用于 Query 参数,以实现复杂的验证逻辑。 from fastapi import F…

设计模式--装饰器模式

装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们向一个现有的对象添加新的功能,同时又不改变其结构。就增加功能来说,装饰器模式相比生成子类更为灵活。这种模式创建了一个包装对象&#xf…

51单片机-LED闪烁

时间&#xff1a;2024.8.28 作者&#xff1a;Whappy 目的&#xff1a;学习51单片机 代码&#xff1a; #include <REGX52.H> #include "intrins.h"void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} …

音视频解码 AVIO内存输入模式

原因 根据下文&#xff0c;我们已经学会了如何从本地文件读取数据&#xff0c;对音视频进行解码操作得到原始数据。 ffmpeg 音视频解码-CSDN博客 现在有一个需求&#xff0c;网络读取到的数据&#xff0c;也就是内存数据如何直接进行解码操作&#xff1f; 本文就是介绍解决…

特种设备作业气瓶作业试题附答案

1.液化石油气瓶检验完毕后&#xff0c;逐只进行抽真空其主要目的是()。 A、提高气体的纯度 B、防止形成爆鸣气体 C、验证检验质量 D、提高充装速度 答案:B 2.无“()”监督检验钢印标记的气瓶严禁充装。 A、SC B、CC C、TS D、SS 答案:C 3.特种气瓶是指()。 A、盛装液化石油气…

微积分复习笔记 Calculus Volume 1 - 1.3Trigonometric Functions

1.3 Trigonometric Functions - Calculus Volume 1 | OpenStax

H264码流结构讲解

所谓的码流结构就是指&#xff1a;视频经过编码之后所得到的数据是怎样排列的&#xff0c;换句话说&#xff0c;就是编码后的码流我们该如何将一帧一帧的数据分离开来&#xff0c;哪一块数据是一帧图像&#xff0c;哪一块是另外一帧图像&#xff0c;只要了解了这个&#xff0c;…

【原型模式】

原型模式 Prototype Pattern 属于创建型模式是指原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象&#xff0c;调用者不需要知道任何创建细节&#xff0c;不调用构造函数关键点&#xff1a;不通过 new 关键字&#xff0c;而是通过方法去创建对象 原型模…

高职院校人工智能训练师边缘计算实训室建设方案

一、引言 随着人工智能技术的飞速发展&#xff0c;边缘计算在提升数据处理效率、降低延迟、保护数据安全等方面展现出巨大潜力。高职院校作为技能型人才培养的重要基地&#xff0c;建设人工智能训练师边缘计算实训室&#xff0c;旨在培养掌握前沿技术、具备实战能力的复合型人才…

自定义Shell程序(内附源码)

在这篇博客中&#xff0c;我们将深入探讨如何自行编写一个简单的Shell程序&#xff0c;我们的示例程序是一个用C语言编写的名为myshell的小型命令行界面。这个项目不仅是对操作系统如何通过命令行与用户互动的一个实用介绍&#xff0c;同时也展示了环境变量、进程创建和命令解析…

Python 全栈系列265 使用ORM、Kafka、Apscheduler实现任务的并发处理

说明 这次的尝试&#xff0c;从框架来说是比较成功的。但是不太走运的是&#xff0c;有一个小的磁盘回收没有写&#xff0c;结果在我外出旅游的时候磁盘打满&#xff0c;导致任务没有按预期执行完&#xff0c;这点比较遗憾。 这里快速把实现的框架梳理一下&#xff0c;后续可…

差旅游记|绵阳:生活的意义在于体验

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 几年前在微博上有个段子广为流传&#xff0c;说是梁朝伟哪天烦闷了&#xff0c;就去机场&#xff0c;赶上哪班就搭哪班&#xff0c;比如去伦敦广场晒太阳&#xff0c;发呆&#xff0c;喂鸽子&#xff0c;完了再搭最近…

Azure Data Factory 多选选项集不受支持

在用ADF往外部推数据时&#xff0c;会碰到CRM的一种数据类型&#xff0c;多选下拉框&#xff0c;如下图中的 如果我们把多选字段输入源字段中&#xff0c;会得到如下的提示 查询官方文档&#xff0c;则有如下的说法 所以把值往外推就需要变通下&#xff0c;例如使用一个文本字段…

爬虫:爬取MDPI杂志中国作者单位和邮箱

Python爬虫&#xff0c;简单来说&#xff0c;就是使用Python编程语言编写的一种自动化获取网页内容的程序。它们能够模拟人类浏览网页的行为&#xff0c;如访问网页、解析网页内容、甚至填写表单和点击链接等&#xff0c;从而帮助我们从互联网上大量收集和处理数据。Python爬虫…

dart 字符串截取

截取 String str "500001"; String lastThreeDigits str.substring(str.length - 3);在这个例子中&#xff0c;str.length - 3计算的是开始截取的索引位置&#xff0c;它从字符串的倒数第三个字符开始截取&#xff0c;一直到字符串的末尾。因此&#xff0c;lastTh…