news 2026/2/17 3:08:10

详细介绍互斥锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
详细介绍互斥锁

互斥锁(Mutex,全称Mutual Exclusion)是多线程同步的基础机制,核心作用是保证同一时间只有一个线程能进入临界区,避免共享资源的并发读写冲突,是解决数据竞争问题的核心工具。

一、核心作用

通过“加锁-解锁”的原子操作,实现临界区的互斥访问

  • 临界区:访问共享资源(如全局变量、共享内存)的代码段;
  • 互斥性:一个线程持有锁时,其他线程尝试加锁会被阻塞,直到锁被释放。
二、关键特性
  1. 原子性:加锁( lock )和解锁( unlock )操作是不可分割的,不会被线程调度器打断;
  2. 唯一性:同一时间只有一个线程能持有锁;
  3. 阻塞性:未获取到锁的线程会进入阻塞状态(而非轮询),降低CPU资源消耗;
  4. 可重入性(部分互斥锁):支持同一线程多次加锁(需对应次数解锁),避免“线程自己锁死自己”。
三、POSIX互斥锁(C语言)的核心函数

以 pthread_mutex_t 为例(Linux下常用):

函数功能
pthread_mutex_init初始化互斥锁,参数指定锁的属性(如是否可重入、进程间共享)
pthread_mutex_lock尝试获取锁:
- 锁空闲:立即获取并返回;
- 锁被占用:阻塞当前线程,直到锁被释放
pthread_mutex_trylock尝试获取锁:
- 锁空闲:获取并返回0;
- 锁被占用:直接返回错误(不阻塞)
pthread_mutex_unlock释放锁:
- 唤醒一个阻塞在该锁上的线程;
- 仅能由持有锁的线程调用
pthread_mutex_destroy销毁互斥锁,释放资源(需确保锁已被释放)
四、典型使用流程(保护共享变量)
#include<pthread.h>#include<stdio.h>pthread_mutex_tmutex;// 互斥锁intshared_var=0;// 共享变量void*thread_func(void*arg){for(inti=0;i<10000;i++){// 加锁:进入临界区pthread_mutex_lock(&mutex);shared_var++;// 操作共享变量// 解锁:离开临界区pthread_mutex_unlock(&mutex);}returnNULL;}intmain(){pthread_mutex_init(&mutex,NULL);// 初始化锁pthread_tt1,t2;pthread_create(&t1,NULL,thread_func,NULL);pthread_create(&t2,NULL,thread_func,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);printf("shared_var最终值:%d\n",shared_var);// 正确输出20000(无锁时可能小于20000)pthread_mutex_destroy(&mutex);// 销毁锁return0;}
五、常见互斥锁类型(按属性)
锁类型特点
普通锁(默认)不可重入,同一线程多次加锁会死锁。
可重入锁同一线程可多次加锁,需对应次数解锁;适合递归/嵌套场景。
进程间共享锁锁存储在共享内存中,支持跨进程线程互斥;默认仅限同进程。

互斥锁和条件变量通常配合使用

  • 互斥锁:保护共享资源的读写;
  • 条件变量:实现线程的等待-通知逻辑;
  • 例如生产者-消费者模型中,互斥锁保护队列的读写,条件变量让消费者等待“队列非空”、生产者等待“队列不满”。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 22:03:42

从春晚AI基建看教育行业智能化未来:你的课堂,准备好进化了吗?

刚刚&#xff0c;一则行业新闻引发科技界与教育界的共同关注&#xff1a;2026年总台春晚宣布将AI确立为全链路技术基础设施&#xff0c;并与火山引擎、豆包达成独家合作。这并非简单的技术展示或互动点缀&#xff0c;而是一次深刻的“系统迁移”——国家级舞台的核心&#xff0…

作者头像 李华
网站建设 2026/2/14 6:30:51

如何把本地文件夹和已存在的 GitHub 远程仓库同步

在GITHUB仓库上传图片并获取URL 这篇博客中介绍了如何搭建自己的图床&#xff0c;现在收集了一些图片&#xff0c;想更新一下里面的图片。 那如何把本地文件夹和已存在的 GitHub 远程仓库同步呢&#xff1f; 现在的问题是&#xff1a; GitHub 上已经有一个仓库&#xff0c;里…

作者头像 李华
网站建设 2026/2/9 0:22:42

基于MCGS嵌入式的饮料灌装生产流水线组态仿真(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于MCGS嵌入式的饮料灌装生产流水线组态仿真(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 基于PLC的饮料罐装生产线控制系统设计(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可…

作者头像 李华
网站建设 2026/2/11 11:47:49

【Android毕设源码分享】基于springboot+微信小程序的医院医疗设备管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/5 4:49:40

【Android毕设全套源码+文档】基于SpringBoot+Vue的个人健康管理小程序的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/8 1:56:08

【Android毕设全套源码+文档】基于微信小程序的古代天文知识科普系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华