互斥锁(mutex)的使用
互斥锁的使用范围:
互斥锁(Mutex)是在原子操作API的基础上实现的信号量行为。互斥锁不能进行递归锁定或解锁,能用于交互上下文但是不能用于中断上下文,同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。当无法获取锁时,线程进入睡眠等待状态。
互斥锁的数据结构:
struct mutex {/* 1: unlocked, 0: locked, negative: locked, possible waiters */atomic_t count;spinlock_t wait_lock;struct list_head wait_list;#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)struct task_struct *owner;#endif#ifdef CONFIG_MUTEX_SPIN_ON_OWNERstruct optimistic_spin_queue osq; /* Spinner MCS lock */#ifdef CONFIG_DEBUG_MUTEXESvoid *magic;#ifdef CONFIG_DEBUG_LOCK_ALLOCstruct lockdep_map dep_map;};
结构体成员说明:
1、atomic_t count;
指示互斥锁的状态:1 没有上锁,可以获得;0 被锁定,不能获得。初始化为没有上锁。
2、spinlock_t wait_lock;
等待获取互斥锁中使用的自旋锁。在获取互斥锁的过程中,操作会在自旋锁的保护中进行。初始化为为锁定。
3、struct list_head wait_list;
等待互斥锁的进程队列。
如何使用互斥锁
第一步:是要定义一把锁:
很简单咯,struct mutex st_mutex_xxx;
第二步:初始化互斥锁
mutex_init
第三步 上锁:
你定义了锁就是为了使用它,那么我们就说一下三种上锁的方法把:
第一,void mutex_lock(struct mutex *lock);
这个函数无法获得锁时就会睡眠,直到可以获取这把锁,这期间是不能被信号打断的。
第二,int mutex_trylock(struct mutex *lock);
看名字就知道是第一个函数的非阻塞版本,尝试去加锁,锁上了返回1,没锁上返回0;
第三, int mutex_lock_interruptible(struct mutex *lock);
和mutex_lock()一样,也是获取互斥锁。在获得了互斥锁或进入睡眠直到获得互斥锁之后会返回0。如果在等待获取锁的时候进入睡眠状态收到一个信号(被信号打断睡眠),则返回_EINIR。
第四步:解锁
void mutex_unlock(struct mutex *lock);
互斥锁(mutex)的使用相关推荐
- 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
摘要:本文带领大家一起剖析鸿蒙轻内核的互斥锁模块的源代码,包含互斥锁的结构体.互斥锁池初始化.互斥锁创建删除.申请释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十 互斥锁Mutex& ...
- 一文带你剖析LiteOS互斥锁Mutex源代码
本文分享自华为云社区<LiteOS内核源码分析系列七 互斥锁Mutex>,原文作者:zhushy. 多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源,只能 ...
- 互斥锁(mutex lock)
互斥锁 解决临界区最简单的工具就是互斥锁(mutex lock) 一个进程在进入临界区的时候获得锁(函数acquire) 在退出临界区时释放锁(函数release) 每个互斥锁都有一个布尔变量avai ...
- 互斥锁(mutex)
原文地址:https://blog.csdn.net/qq_39736982/article/details/82348672 Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资 ...
- android 线程互斥锁,线程锁(互斥锁Mutex)及递归锁
一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...
- 互斥锁mutex的使用方法
在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthrea ...
- php mutex,go互斥锁Mutex
go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...
- 多线程之互斥锁(mutex)的使用方法
关于读写锁可查看:多线程之读写锁(unique_lock与shared_lock) 多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁). 引用 cpprefere ...
- 互斥锁Mutex解锁两次
一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的. 那么已经解锁的互斥锁,还能再次 ...
最新文章
- 源码mysql安装问题_MySQL5.7源码安装问题汇总
- 一起学react day1
- nginx大量TIME_WAIT的解决办法 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'...
- 步入三十岁前的总结:看似经历很多得到很多,但,实际却一无所得
- 和redis_Redis 缓存
- Apache的流处理技术概述
- TY_GASPX SQL
- 设计模式之——动态代理模式
- XLSTransformer生成excel文件简单示例
- 《程序员修炼之道 - 从小工到专家》吐血解读
- Activiti流程引擎与业务整合方案
- 无线数字信息传送服务器,无线数字远程监控管理及网站实时推广项目方案.doc...
- java实现微信订阅消息(服务通知)
- 高速高精度半导体运动台设计(二)
- python解决经典数学问题-用python解决普通高中数学书A必修三题目(一)
- 金庸小说人物知识图谱构建——获取共现关系
- 常用的数学符号sup(上确界) 和 inf(下确界)以及少量数学公式的markdown模式下latex 格式 编写
- 什么是SAP ECC企业控制中心系统 ECC简介
- 马士兵JVM课程笔记
- 部分有关 广告联盟作弊 与反作弊资料收集
热门文章
- 如何对复杂网络建模所需要的数据进行预处理
- ajax里的append,使用AJAX源和appendTo理解和实现jQuery自动完成
- ab压力测试是使用以及介绍
- 同步锁(synchronized)_37
- 82055-94-5|N3-PEG-N3|Azide-PEG-Azide|叠氮PEG叠氮可修饰蛋白质
- 基于Linux的考勤机设计方案V1.1(终端软件部分)
- transformer的简要解读(应该都能看懂)
- System.out::println; 是什么鬼???
- 快手小店通效果好吗?
- 傅里叶级数、傅里叶变换、短时傅里叶变换 公式