如何理解互斥锁概念

embedded/2024/9/19 11:37:13/ 标签: 开发语言, c++, 信息与通信, 物联网

目录

一、什么是互斥锁

   1、定义

2. 工作原理

3. 避免问题

4. 实现方式

5. 使用场景


一、什么是互斥锁

   1、定义

         互斥锁(Mutual Exclusion Lock)是一种机制,用于确保同一时间只有一个线程可以访问特定的共享资源。它类似于一把“锁”,只有获取了这把锁的线程才能访问被保护的资源。

2. 工作原理

  • 加锁:当一个线程需要访问共享资源时,它首先需要获取互斥锁。如果锁当前没有被其他线程持有,线程将成功获得锁并进入临界区(即访问共享资源的代码部分)。
  • 解锁:当线程完成对共享资源的访问后,它必须释放互斥锁,使其他等待中的线程可以继续访问共享资源。
  • 阻塞:如果另一个线程试图获取一个已经被持有的锁,该线程将被阻塞(即等待),直到锁被释放。

3. 避免问题

  • 死锁:如果多个线程在持有锁时都等待对方释放锁,就会发生死锁。为了避免死锁,可以设计合理的锁获取顺序,或者使用超时机制。
  • 饥饿:如果某些线程总是得不到锁,可能会导致饥饿现象。可以通过公平的锁策略(例如公平锁)来减少这种情况的发生。

4. 实现方式

        互斥锁的实现可以基于操作系统提供的原语,比如互斥量(mutex),信号量(semaphore),或者基于自旋锁(spinlock)等技术。

#include <iostream>
#include <pthread.h>
#include <unistd.h>  // 用于 sleep 函数// 定义互斥锁
pthread_mutex_t mutex;// 线程函数
void* threadFunction(void* arg) {// 尝试获取互斥锁pthread_mutex_lock(&mutex);// 临界区开始:访问共享资源std::cout << "线程 " << pthread_self() << " 进入临界区" << std::endl;sleep(1);  // 模拟对共享资源的操作std::cout << "线程 " << pthread_self() << " 离开临界区" << std::endl;// 释放互斥锁pthread_mutex_unlock(&mutex);return nullptr;
}int main() {// 初始化互斥锁if (pthread_mutex_init(&mutex, nullptr) != 0) {std::cerr << "无法初始化互斥锁" << std::endl;return 1;}const int NUM_THREADS = 5;pthread_t threads[NUM_THREADS];// 创建多个线程for (int i = 0; i < NUM_THREADS; ++i) {if (pthread_create(&threads[i], nullptr, threadFunction, nullptr) != 0) {std::cerr << "无法创建线程 " << i << std::endl;return 1;}}// 等待所有线程完成for (int i = 0; i < NUM_THREADS; ++i) {pthread_join(threads[i], nullptr);}// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

5. 使用场景

        互斥锁广泛应用于各种需要保护共享资源的场景,如多线程程序中的数据结构操作、文件读写、网络通信等。

        总之,互斥锁是一种非常重要的同步工具,正确使用它可以有效避免并发编程中的许多常见问题,提高程序的安全性和稳定性。

 

 


http://www.ppmy.cn/embedded/107202.html

相关文章

redis被攻击redis READONLY You can‘t write against a read only slave.

redis 日志路径 /var/log/redis 拿下来后发现有这种错误 Operation now in progress 可能是网络断开导致&#xff0c; 查找redis whereis redis 修改 vim /etc/redis.conf 大概在300行 下面代码yes改no slave-read-only no 重启redis sudo systemctl restart redis.…

【Python】简单的数据类型——int、float、bool、str

目录 1. 整数类型 int 2. 浮点数类型 float 3. 布尔类型 bool 4. 字符串 str 5. 类型转换 5.1 隐式类型转换 5.2 显示类型转换 6. 输出 6.1 print函数 6.2 格式化输出 7. 输入 1. 整数类型 int a 10 print(type(a)) print(type(-2))<class int> <class i…

ARM发布新一代高性能处理器N3

简介 就在2月21日&#xff0c;ARM发布了新一代面向服务器的高性能处理器N3和V3&#xff0c;N系列平衡性能和功耗&#xff0c;而V系列则注重更高的性能。此次发布的N3&#xff0c;单个die最高32核&#xff08;并加入到CCS&#xff0c;Compute Subsystems&#xff0c;包含Core&a…

基于uniapp的畅玩旅游景点门票预订系统的设计与实现b3w12 微信小程序

目录 博主介绍技术栈系统设计&#x1f31f;文末获取源码数据库&#x1f31f;具体实现截图后端前端java类核心代码部分展示可行性论证个人心得系统测试操作可行性源码获取详细视频演示 博主介绍 &#x1f447;&#x1f3fb; 博主介绍&#xff1a;&#x1f447;&#x1f3fb; 专…

如何本地搭建Whisper语音识别模型|语音识别|本地部署

目录 1. 环境配置 1.1 操作系统要求 1.2 安装依赖库 1.3 GPU支持的配置 2. 获取Whisper模型 2.1 克隆Whisper代码库 2.2 下载预训练模型 3. Whisper模型的部署与使用 3.1 加载Whisper模型 3.2 处理音频数据 3.3 语音识别 4. Whisper模型的高级配置与优化 4.1 自定…

利用TOPSIS算法进行生长素和施肥量对农作物各指标影响力的分析

文章目录 1 摘要2 问题的重述1&#xff0e; 背景介绍2&#xff0e; 问题的产生及进行数学建模的意义 3 TOPSIS算法1. TOPSIS算法介绍2. TOPSIS算法使用步骤 4 问题的分析1. 对问题一的分析及解答2. 对问题二的分析及解答3. 对问题三的分析及解答 5 模型的改进1. 验证2.模型改进…

聊聊,IEEE论文的含金量!

IEEE论文的含金量在学术界被广泛认可&#xff0c;这主要体现在以下几个方面&#xff1a; 学术价值&#xff1a;IEEE论文的学术价值体现在其研究内容的深度和广度上。这些论文通常涉及前沿的科学技术问题&#xff0c;提出创新性的理论、方法或实验结果。例如&#xff0c;在人工…

STL容器中 list(双向链表)的增删改查

list&#xff08;双向链表&#xff09; std::list 是 C 标准模板库&#xff08;STL&#xff09;中的一个容器&#xff0c;它实现了一个双向链表。双向链表中的每个元素都包含三个部分&#xff1a;存储数据的元素本身、指向前一个元素的指针&#xff08;或迭代器&#xff09;、…

Python 和 Java 区别是什么?哪个运行效率高?为什么?

一、Python 和 Java 的区别 1. 编程风格 • Python 是一种解释型动态编程语言&#xff0c;语法简洁、灵活&#xff0c;代码较为简洁直观&#xff0c;注重代码的可读性和简洁性&#xff0c;使用缩进来表示代码块。 • Java 是一种编译型静态编程语言&#xff0c;语法相对严谨…

[Leetcode] 接雨水(相向双指针)

可以直接移步大神的解题思路&#xff0c;非常详细 -> 盛最多水的容器 接雨水_哔哩哔哩_bilibili 11. 盛最多水的容器 https://leetcode.cn/problems/container-with-most-water/description/ 42. 接雨水 https://leetcode.cn/problems/trapping-rain-water/description/ 11…

python实现人工蜂群算法

博客目录 引言 什么是人工蜂群算法&#xff08;ABC&#xff09;&#xff1f;人工蜂群算法的应用场景为什么使用人工蜂群算法&#xff1f; 人工蜂群算法的原理 人工蜂群算法的基本概念人工蜂群算法的三种蜜蜂类型人工蜂群算法的流程人工蜂群算法的特点与优势 人工蜂群算法的实…

pytest二次开发:生成用例参数

pytest.fixture是一个装饰器&#xff0c;用于声明一个fixture。Fixture是pytest中的一个核心概念&#xff0c;它提供了一种将测试前的准备代码&#xff08;如设置测试环境、准备测试数据等&#xff09;和测试后的清理代码&#xff08;如恢复测试环境、删除临时文件等&#xff0…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的&#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前&#xff0c;Linux、Windows、安卓这些系统&#xff0c;其底层的计时系统都是使用Unix时间戳。 Uinx时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

滑动窗口序列(单序列双指针)9/5

一、不间断子数组(滑动窗口哈希表) 题意&#xff1a; 给你一个数组nums,现在求子数组中都有 0 < |nums[i1] - nums[i2]| < 2 。这样称一个不间断子数组。&#xff08;简而言之&#xff1a;子数组中最大值和最小值的差距必须<2&#xff09;。求不间断子数组的数量 输…

Android 14(API 级别 34)中,DexClassLoader 不再支持可写 dex/jar 文件

Android 14&#xff08;API 级别 34&#xff09;中&#xff0c;DexClassLoader 不再支持从可写文件加载 dex/jar 文件。这意味着从Android 14开始&#xff0c;你不能再使用 DexClassLoader 来动态加载位于内部存储中的dex/jar文件&#xff0c;除非这些文件被设置为只读。 解决…

2024国赛数学建模A题思路模型代码

2024国赛数学建模思路资料&#xff0c;思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模&#xff1a;两次校赛&#xff0c;两次国赛&#xff0c;两次美赛&#xff0c;一次电工杯。从大一下学期组队到现在&#xff0c;大三下学期&#xff0c;时间飞逝&#xff0c;我的…

Unity数据持久化 之 二进制存储法

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 前置知识&#xff1a;1 Byte 8 bit &#xff0c;所以0000 00001 就是一个字节&#xff0c; 该串数字转为十进制代表1…

2024.8.29 Python,排序算法,列表的append规则

1.append和 res[] nums1[1,2,3] res.append(nums1[1]) print(res)#输出[2] res.append([nums1[1]]) print(res)#输出[[2]] res.append(nums1[1:2]) print(res)#输出[[2]] res.append(nums1[1:3]) print(res)#输出[[2,3]] resnums1[1:3] print(res)#输出[2,3]也就是说&#xff…

【MATLAB源码-第164期】基于matlab的轴承故障三种谱图:细化谱,功率谱,倒谱对比分析仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 轴承故障分析是一种重要的维护和监控手段&#xff0c;能够帮助工程师及时发现和解决轴承在运行中可能遇到的各种问题。在轴承故障诊断中&#xff0c;通常会使用到三种谱图分析方法&#xff1a;细化谱&#xff08;Fine Spectr…