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

news2024/9/23 5:34:56

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

互斥锁

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

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

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

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

在这里插入图片描述

读写锁

读写锁也叫做 共享互斥锁

他有三种状态:

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

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

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

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

在这里插入图片描述

自旋锁

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

自旋锁可用于以下情况:

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

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

在这里插入图片描述

信号量

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

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

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

在这里插入图片描述

条件变量

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

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

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

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

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

总结

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

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

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

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

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

相关文章

【go-zero】win启动rpc服务报错 panic: context deadline exceeded

win启动rpc服务报错 panic: context deadline exceeded 问题来源 在使用go-zero生成的rpc项目后 启动不起来 原因 这个问题原因是wndows没有启动etcd 官方文档是删除了etcd配置 而我自己的测试yaml配置有etcd,所以需要启动etcd 下载安装好etcd后&#xff0…

Java Full GC 的常见原因及优化策略

Java Full GC 的常见原因及优化策略 1、导致Full GC的常见原因1.1 新生代设置过小1.2 新生代设置过大1.3 Survivor区设置不当 2、优化GC策略2.1 吞吐量优先2.2 暂停时间优先 3、结论 💖The Begin💖点点关注,收藏不迷路💖 在Java应…

自控原理-传递函数(闭环 扰动 偏差 前馈 复合 顺馈)

都知道闭环传递函数定义为:G1G2/(1G1G2H) 但是当碰到复杂的系统,比如复合顺馈,前馈扰动等,就不知道分子到底要不要乘上G2了。 这个公式是如何推导出来的,今天看到一个公式图片: 过程非常详细。 由此我也…

C语言遇见的一些小问题

问题如下&#xff1a; 1&#xff1a;为什么这样的代码为报错 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cstdio> #include<string> #include<stdlib.h> using namespace std; int main() {int i …

C语言 ——— #define定义标识符

目录 #define 定义常变量 #define 定义字符串 #define 定义一条代码 #define 定义的标识符是否需要加分号 #define 定义常变量 代码演示&#xff1a; #define M 100 //定义常变量 代码用途&#xff1a; int a M; int arr[M] { 0 }; 此时的 M 具有常属性&#xff0c…

什么是UART?

1.什么是UART&#xff1f; 通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART。UART 表示通用异步接收机/发射机&#xff0c;定义用于在两个设备之间交换串行数据的协议或一组规则。UART 非常简单&#xff0c;仅在发射机和…

C语言中static与extern关键字的深入解析

在C语言编程中&#xff0c;static和extern是两个非常重要的关键字&#xff0c;它们各自有着独特的用途。本文将深入探讨这两个关键字的工作原理、底层实现机制以及在实际开发中的应用。 static关键字 1. 原理与作用 static关键字用于声明变量或函数具有特定的作用域和生命周…

5.4分段线性灰度变换

目录 实验原理 分段线性灰度变换的概念 变换函数的形式 示例代码1 示例结果1 示例代码2 示例结果2 示例代码3 运行结果3 示例代码4 运行结果4 实验原理 在OpenCV中&#xff0c;分段线性灰度变换&#xff08;Piecewise Linear Gray Level Transformation&#xff09…

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…

【Prometheus】Prometheus的特点、数据采集方式、架构、数据模型详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

vue3整合antv x6实现图编辑器快速入门

安装&#xff1a; npm install antv/x6 --save如果使用 umd 包&#xff0c;可以使用下面三个 CDN 中的任何一个&#xff0c;默认使用 X6 的最新版&#xff1a; https://unpkg.com/antv/x6/dist/index.jshttps://cdn.jsdelivr.net/npm/antv/x6/dist/index.jshttps://cdnjs.clo…

从汇编层看64位程序运行——likely提示编译器的优化案例和底层实现分析

大纲 代码分析with_attributes::powno_attributes::pow分析 我们在《Modern C——使用分支预测优化代码性能》一文中介绍了likely提示编译器进行编译优化&#xff0c;但是我们又讲了最终优化不是对分支顺序的调换&#xff0c;那么它到底做了什么样的优化&#xff0c;让整体性能…

个人旅游网(5)——功能详解——购物车功能

文章目录 一、设计购物车二、购物车对redis的一系列操作三、购物车3.1、接口详解3.1.1、addCart&#xff08;将当前旅游路线加入到购物车中&#xff09;3.1.2、showCartItem&#xff08;显示刚刚加入购物车的商品&#xff09;3.1.3、findAll&#xff08;将购物车里的所有旅游路…

骨灵冷火!Solon Cloud Gateway 照面发布

骨灵冷火&#xff0c;是练药的好火哟。极冷&#xff0c;又极热。在冰冻中被烧死&#xff1a;&#xff09; 1、认识 Solon Cloud Gateway Solon Cloud Gateway 是基于 Solon Cloud、Vert.X 和 Solon Rx(reactive-streams) 接口实现。小特点&#xff1a; 纯响应式的接口体验流…

KAN学习Day1——模型框架解析及HelloKAN

说明 最近了解到了一个新东西——KAN&#xff0c;我的毕设导师给推荐的船新框架。我看过很多剖析其原理的文章&#xff0c;发现大家对其持有的观点都各不相同&#xff0c;有的说可以颠覆传统MLP&#xff0c;有的说可以和Transformer同等地位&#xff0c;但是也有人说它训练速度…

YoloV8改进策略:IoU改进|Unified-IoU用于高质量对象检测

摘要 Unified-Unified-IoU&#xff08;UIoU&#xff09;是一种新的边界框回归损失函数&#xff0c;旨在改进目标检测任务中的预测框质量&#xff0c;特别是在高IoU阈值和IoU&#xff08;UIoU&#xff09;是一种新的边界框回归损失函数&#xff0c;旨在改进目标检测任务中的预测…

nginx的基本使用示例(负载均衡,虚拟主机,动静分离)的详细配置过程

文章目录 前言前置工作httpd主机tomcat主机 nginx主机配置负载均衡配置过程效果展示 虚拟主机配置过程效果展示 动静分离配置过程 排除思路 前言 本篇博客展示nginx的基本使用案例&#xff0c;后端由httpdtomcat组成&#xff0c;linux版本: rocky9.2 虚拟机ipnginx192.168.10…

安防监控视频打手机检测算法核心技术打手机检测算法源码、模型简介

在数字化的今天&#xff0c;智能手机几乎已成为人们生活中不可或缺的一部分。然而&#xff0c;手机的广泛使用也带来了一些挑战&#xff0c;比如在公共场所、教育机构和工作环境中的手机干扰。为了解决这些问题&#xff0c;打手机检测算法应运而生&#xff0c;成为管理人员和机…

hive学习(六)

一、函数 1.单行函数 特点&#xff1a;输入一行&#xff0c;输出一行&#xff08;一进一出&#xff09; 可分为日期函数&#xff0c;字符串函数&#xff0c;集合函数&#xff0c;数学函数和流程控制函数等 1&#xff09;算术运算函数 2&#xff09;数值函数 --round函数 …

机器学习如何用于音频分析?

机器学习如何用于音频分析&#xff1f; 一、说明 近十年来&#xff0c;机器学习越来越受欢迎。事实上&#xff0c;它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步&#xff0c;机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…