互斥锁的使用范围:
互斥锁(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)的使用相关推荐

  1. 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”

    摘要:本文带领大家一起剖析鸿蒙轻内核的互斥锁模块的源代码,包含互斥锁的结构体.互斥锁池初始化.互斥锁创建删除.申请释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十 互斥锁Mutex& ...

  2. 一文带你剖析LiteOS互斥锁Mutex源代码

    本文分享自华为云社区<LiteOS内核源码分析系列七 互斥锁Mutex>,原文作者:zhushy. 多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源,只能 ...

  3. 互斥锁(mutex lock)

    互斥锁 解决临界区最简单的工具就是互斥锁(mutex lock) 一个进程在进入临界区的时候获得锁(函数acquire) 在退出临界区时释放锁(函数release) 每个互斥锁都有一个布尔变量avai ...

  4. 互斥锁(mutex)

    原文地址:https://blog.csdn.net/qq_39736982/article/details/82348672 Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资 ...

  5. android 线程互斥锁,线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

  6. 互斥锁mutex的使用方法

    在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthrea ...

  7. php mutex,go互斥锁Mutex

    go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...

  8. 多线程之互斥锁(mutex)的使用方法

    关于读写锁可查看:多线程之读写锁(unique_lock与shared_lock) 多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁). 引用 cpprefere ...

  9. 互斥锁Mutex解锁两次

    一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的. 那么已经解锁的互斥锁,还能再次 ...

最新文章

  1. 源码mysql安装问题_MySQL5.7源码安装问题汇总
  2. 一起学react day1
  3. nginx大量TIME_WAIT的解决办法 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'...
  4. 步入三十岁前的总结:看似经历很多得到很多,但,实际却一无所得
  5. 和redis_Redis 缓存
  6. Apache的流处理技术概述
  7. TY_GASPX SQL
  8. 设计模式之——动态代理模式
  9. XLSTransformer生成excel文件简单示例
  10. 《程序员修炼之道 - 从小工到专家》吐血解读
  11. Activiti流程引擎与业务整合方案
  12. 无线数字信息传送服务器,无线数字远程监控管理及网站实时推广项目方案.doc...
  13. java实现微信订阅消息(服务通知)
  14. 高速高精度半导体运动台设计(二)
  15. python解决经典数学问题-用python解决普通高中数学书A必修三题目(一)
  16. 金庸小说人物知识图谱构建——获取共现关系
  17. 常用的数学符号sup(上确界) 和 inf(下确界)以及少量数学公式的markdown模式下latex 格式 编写
  18. 什么是SAP ECC企业控制中心系统 ECC简介
  19. 马士兵JVM课程笔记
  20. 部分有关 广告联盟作弊 与反作弊资料收集

热门文章

  1. 如何对复杂网络建模所需要的数据进行预处理
  2. ajax里的append,使用AJAX源和appendTo理解和实现jQuery自动完成
  3. ab压力测试是使用以及介绍
  4. 同步锁(synchronized)_37
  5. 82055-94-5|N3-PEG-N3|Azide-PEG-Azide|叠氮PEG叠氮可修饰蛋白质
  6. 基于Linux的考勤机设计方案V1.1(终端软件部分)
  7. transformer的简要解读(应该都能看懂)
  8. System.out::println; 是什么鬼???
  9. 快手小店通效果好吗?
  10. 傅里叶级数、傅里叶变换、短时傅里叶变换 公式