码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 同步 -- 互斥锁


     本篇文章基于Linux-6.5源码

    建议:搭配Linux源码观看更佳

    1. struct mutex {
    2. atomic_long_t owner;
    3. spinlock_t wait_lock; //自旋锁,该自旋锁的作用是保护后面的等待队列的原子性
    4. struct list_head wait_list; //等待队列
    5. };

    API接口

    mutex_init

    互斥锁初始化比较简单,就是把owner,wait_lock,wait_list这几个成员初始化一下

    1. #define mutex_init(mutex) \
    2. do { \
    3. static struct lock_class_key __key; \
    4. \
    5. __mutex_init((mutex), #mutex, &__key); \
    6. } while (0)
    7. void __mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key)
    8. {
    9. atomic_long_set(&lock->owner, 0);//初始化锁的所有者
    10. spin_lock_init(&lock->wait_lock);//初始化自旋锁
    11. INIT_LIST_HEAD(&lock->wait_list);//初始化等待队列
    12. }

    mutex_lock

    加锁:mutex_lock

    1. void __sched mutex_lock(struct mutex *lock)
    2. {
    3. might_sleep();
    4. //尝试直接加锁,如果不成功,则进入slowpath,
    5. if (!__mutex_trylock_fast(lock))
    6. __mutex_lock_slowpath(lock);
    7. }
    8. EXPORT_SYMBOL(mutex_lock);
    9. static __always_inline bool __mutex_trylock_fast(struct mutex *lock)
    10. {
    11. unsigned long curr = (unsigned long)current;//sp_el0,指向当前进程的task_struct
    12. unsigned long zero = 0UL;
    13. //判断owner是否为0,如果为0表示当前锁没有被占用,则把current写入owner返回true表示加锁成功
    14. if (atomic_long_try_cmpxchg_acquire(&lock->owner, &zero, curr))
    15. return true;
    16. //owner不为0,表示锁被占用了,返回false
    17. return false;
    18. }

    __mutex_lock_slowpath(慢加锁)中执行的过程大概是:

    mutex_unlock

    解锁:mutex_unlock

    1. void __sched mutex_unlock(struct mutex *lock)
    2. {
    3. #ifndef CONFIG_DEBUG_LOCK_ALLOC
    4. if (__mutex_unlock_fast(lock))
    5. return;
    6. #endif
    7. __mutex_unlock_slowpath(lock, _RET_IP_);
    8. }
    9. EXPORT_SYMBOL(mutex_unlock);

    __mutex_unlock_fast(快解锁):比较lock->owner和curr是否一致,一致则直接把0写到lock->owner中,表示解锁。

    __mutex_unlock_slowpath:等待队列的第一个对象出列,表示下一个将要获得锁的任务。把下一个任务的task_struct地址写入到mutex lock的owner变量中(相当于下一个任务获得了互斥锁),唤醒下一个任务继续执行。

  • 相关阅读:
    华为云云服务器评测 | 微信小程序使用JSAPI实现微信支付,从商户注册到成功支付全流程说明(含完整测试demo)
    【C++】—— 特殊类设计
    基于C#+MySQL的停车场管理系统设计与实现
    网赚博客如何月入过万?
    【软考高级信息系统项目管理师--第五章:信息系统工程下】
    Java中实现一维数组逆序交换的完整解决方案
    LeetCode 200. 岛屿数量
    前端HTML面试题:meta 元素都有什么
    AI高考志愿填报:大厂神仙打架,考生付费围观
    Minio多节点多驱动分布式部署官网文档翻译
  • 原文地址:https://blog.csdn.net/qq_52353238/article/details/133014737
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号