1. 锁的本质:解决并发问题的基石

在多线程/多进程环境中,临界区(Critical Section) 是访问共享资源的代码段。锁的核心目标是确保互斥访问——任意时刻仅有一个执行单元能进入临界区。

// 典型临界区示例
pthread_mutex_lock(&mutex); 
balance = balance + 100;  // 共享变量操作
pthread_mutex_unlock(&mutex);
2. 硬件级支持:原子指令的魔力

锁的底层依赖硬件提供的原子操作

  • TSL(Test and Set Lock)
    原子性地读取内存值并设置为新值(通常为1)
    enter_region:TSL REG, LOCK     ; 复制LOCK值到REG,同时设置LOCK=1CMP REG, #0       ; 检查原LOCK值JNE enter_region  ; 非0则循环等待RET
    
  • XCHG(Exchange)
    原子交换寄存器与内存内容(现代CPU更常用)
  • CAS(Compare and Swap)
    条件式原子交换(解决ABA问题)

⚠️ 硬件通过锁定内存总线确保原子性,但需注意:

  • 单核CPU可用屏蔽中断实现原子性
  • 多核系统必须依赖原子指令
3. 互斥锁(Mutex)的实现层级
3.1 用户空间锁(如自旋锁)
  • 适用场景:临界区极短(纳秒级)
  • 原理:忙等待(Busy Waiting)
  • 缺陷:CPU空转浪费资源
    // 基于原子指令的自旋锁
    void spin_lock(int *lock) {while (__sync_lock_test_and_set(lock, 1));
    }
    
3.2 内核辅助锁(如Futex)
  • 混合架构:用户态快速路径 + 内核态慢速路径
  • Linux Futex工作流程
    1. 尝试原子操作获取锁(用户态)
    2. 若失败则调用futex(FUTEX_WAIT)陷入内核
    3. 锁释放时通过futex(FUTEX_WAKE)唤醒等待者
  • 优势:无竞争时无需系统调用
3.3 内核级锁(如pthread_mutex)
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);    // 可能触发系统调用
/* 临界区操作 */
pthread_mutex_unlock(&mutex);
  • 内核行为
    • 锁空闲时直接获取
    • 锁占用时线程进入睡眠态,释放CPU
4. 同步锁的经典范式:生产者-消费者模型
sem_t empty = N;  // 空缓冲区数量
sem_t full = 0;   // 已填充缓冲区数量
pthread_mutex_t mutex; // 缓冲区互斥锁// 生产者
void producer() {sem_wait(&empty);      // 等待空位pthread_mutex_lock(&mutex);insert_item(data);     // 安全写入pthread_mutex_unlock(&mutex);sem_post(&full);       // 增加资源计数
}// 消费者
void consumer() {sem_wait(&full);       // 等待数据pthread_mutex_lock(&mutex);data = remove_item();  // 安全取出pthread_mutex_unlock(&mutex);sem_post(&empty);      // 增加空位
}

关键点

  • 互斥锁(mutex)保护共享缓冲区
  • 信号量(semaphore)协调生产/消费节奏

    1

5. 锁的致命陷阱与规避策略
5.1 死锁(Deadlock)
  • 条件:互斥、持有等待、不可抢占、循环等待
  • 解决方案
    • 锁排序(Lock Ordering)
    • 超时机制(pthread_mutex_trylock
    • 死锁检测算法(银行家算法)
5.2 优先级反转(Priority Inversion)
  • 场景:低优先级线程持有锁,阻塞高优先级线程
  • 解决方案
    • 优先级继承(Linux的PTHREAD_PRIO_INHERIT
    • 优先级天花板(PTHREAD_PRIO_PROTECT

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高密度PCB板生产厂商深度解析

在电子制造领域,高密度PCB(印制电路板)作为核心基础元件,其技术精度与生产稳定性直接影响终端产品性能。本文精选五家具备核心技术优势的国内厂商,通过实地调研与行业数据验证,为读者呈现真实可信的供应商选…

力扣 hot100 Day44

98. 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树 //自…

【基础架构】——软件系统复杂度的来源(低成本、安全、规模)

目录 一、软件系统复杂度的来源之低成本二、软件系统复杂度的来源之安全2.1、功能安全2.2、架构安全2.3、规模2.3.1、功能越来越多,导致系统复杂度指数级上升2.3.2、数据越来越多,系统复杂度发生质变本文来源:极客时间vip课程笔记 一、软件系统复杂度的来源之低成本 当我们设…

机器学习 YOLOv5手绘电路图识别 手绘电路图自动转换为仿真软件(如LT Spice)可用的原理图,避免人工重绘

以下是对《手绘电路图识别》论文的核心解读,结合技术方案、实验数据和创新点进行结构化总结:研究目标 解决痛点:将手绘电路图自动转换为仿真软件(如LT Spice)可用的原理图,避免人工重绘。 关键挑战&#xf…

一般的非线性规划求解(非凸函数)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 每一个裂缝都是为透出光而努力&#x…

CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}

Web 信息泄露 Git泄露 Stash 首先,我们先读题,由题可知我们可以用BugScanTeam或GitHack完成该题那么我们先开题, 好吧,他问我们flag在哪里,我怎么知道fag在哪里。 先打开GitHack 使用 py GitHack.py http://challenge-…

缺乏实际里程碑管控项目进度,如何设定关键节点

要通过实际里程碑管控项目进度,核心措施包括:设定可量化的关键节点、明确交付标准与责任人、同步风险与资源计划、基于阶段目标拆解任务、建立节点验证与复盘机制。例如,设定可量化的关键节点能让团队清晰理解“何时完成了什么”并及时调整方…

XML E4X:深入解析与高效应用

XML E4X:深入解析与高效应用 引言 XML(可扩展标记语言)作为一种数据交换格式,广泛应用于互联网数据传输、配置文件、数据存储等领域。E4X 是一种扩展 XML 的编程接口,允许开发者以编程方式直接访问和处理 XML 数据。本文将深入探讨 XML E4X 的概念、特点、应用场景以及高…

uniapp---入门、基本配置了解

目录 uniapp 新建项目 uniapp全局配置 组件 1、内置组件 2、扩展 组件 uni-ui 3、第三方组件库 uview-ui 秋云-ucharts (插件市场 ) scss语法(了解) vue2语法(熟悉) uniapp 官方文档:uni-app官网 uni-app 是一个使用 Vue.js 开发所…

springboot 好处

思考1,快速启动,简化配置。自动配置,内置tomcat,无需部署war文件,快速创建独立应用2,提高开发效率,热部署3,微服务生态4,云原生,Docker K8sSpring Boot 的主要…

SSM框架学习——day1

SSM框架概述SSM框架是Java开发中常用的组合框架,由Spring、Spring MVC和MyBatis三个开源框架整合而成。主要用于构建企业级Web应用程序,具有轻量级、模块化、易扩展等特点。Spring框架作为核心,提供依赖注入(DI)和面向…

【html基本界面】

小米界面布局效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小米商城布局<…

【设计模式】适配器模式(包装器模式),缺省适配器模式,双向适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;详解 一、适配器模式简介 适配器模式是一种结构型设计模式&#xff0c;它将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以协同工作。 简单来说&#xff0c;适配…

安全初级(一)

一.docker的搭建和VPN连接 1.输入指令&#xff1a;apt-get install docker.io docker-compose 2.设置docker代理&#xff1a;创建文件夹以及对应的文件 /etc/systemd/system/docker.service.d/http-proxy.conf 在该文件中配置自己的代理ip以及代理端口 [Service] Environme…

Java多线程:核心技术与实战指南

目录&#x1f680;前言&#x1f914;什么是多线程&#xff1f;&#x1f4bb;创建线程&#x1f4af;创建方法一&#xff1a;继承Thread类&#x1f4af;创建方法二&#xff1a;实现Runnable接口&#x1f4af;创建方法三&#xff1a;实现Callable接口&#x1f4af;三种方法对比&am…

高斯代数基本定理的一种证明

代数基本定理 对于多项式 f(z)anznan−1zn−1⋯a1za0f(z) a_n z^n a_{n-1} z^{n-1} \cdots a_1 z a_0f(z)an​znan−1​zn−1⋯a1​za0​&#xff08;其中 n>1n > 1n>1 且 an,a0≠0a_n, a_0 \neq 0an​,a0​0&#xff09;&#xff0c;它在复数域内有根。 f(z)U…

【K8S】Kubernetes 使用 Ingress-Nginx 基于 Cookie 实现会话保持的负载均衡

文章目录 1. 创建测试应用 Deployment3. 配置基于 Cookie 的 Ingress4. 部署与测试步骤(1) 应用配置(2) 获取 Ingress IP(3) 测试会话保持(4) 使用 Nginx 取消域名的限制(仅推荐测试使用)5、生产优化建议6、独立 Nginx 配置参考在现代微服务架构中,负载均衡是保证高可用的关…

2.查询操作-demo

在连接数据库的基础上步骤&#xff1a;Query-查询关闭查询db.Next()逐行输出&#xff0c;并指定到当前变量Scan-扫描rows, err : db.Query("SELECT id,server_ip FROM softswitch_server_info")package main//查询语句-demo //关键字-queryimport ("database/sq…

用OpenCV标定相机内参应用示例(C++和Python)

下面是一个完整的 使用 OpenCV 进行相机内参标定&#xff08;Camera Calibration&#xff09; 的示例&#xff0c;包括 C 和 Python 两个版本&#xff0c;基于棋盘格图案标定。一、目标&#xff1a;相机标定 通过拍摄多张带有棋盘格图案的图像&#xff0c;估计相机的内参&#…

(二)OpenCV——边缘增强与检测

边缘增强与检测是图像处理中的核心技术&#xff0c;其核心目标是突出图像中的不连续区域&#xff08;边缘&#xff09;&#xff0c;为后续的图像分析提供基础。一、基本概念边缘本质上是图像中灰度/颜色发生突变的区域&#xff0c;对应着&#xff1a;物体边界表面方向改变材质变…