DEFINE_MUTEX宏包含在  include\linux\mutex.h文件中

#ifdef CONFIG_DEBUG_MUTEXES
# include <linux/mutex-debug.h>
#else
# define __DEBUG_MUTEX_INITIALIZER(lockname)
/**
 * mutex_init - initialize the mutex
 * @mutex: the mutex to be initialized
 *
 * Initialize the mutex to unlocked state.
 *
 * It is not allowed to initialize an already locked mutex.
 */
# define mutex_init(mutex) \
do { \
static struct lock_class_key __key; \
\
__mutex_init((mutex), #mutex, &__key); \
} while (0)
# define mutex_destroy(mutex) do { } while (0)
#endif

#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \
, .dep_map = { .name = #lockname }
#else
# define __DEP_MAP_MUTEX_INITIALIZER(lockname)
#endif

#define __MUTEX_INITIALIZER(lockname) \
{ .count = ATOMIC_INIT(1) \
, .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \
, .wait_list = LIST_HEAD_INIT(lockname.wait_list) \
__DEBUG_MUTEX_INITIALIZER(lockname) \
__DEP_MAP_MUTEX_INITIALIZER(lockname) }

#define DEFINE_MUTEX(mutexname) \
struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)

mutex的结构如下图:

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_SMP)
struct thread_info *owner;
#endif
#ifdef CONFIG_DEBUG_MUTEXES
const char *name;
void *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};

DEFINE_MUTEX的展开:

struct mutex mutexname = {
.count = ATOMIC_INIT(1),
.wait_lock = __SPIN_LOCK_UNLOCKED(mutexname.wait_lock),
.wait_list = LIST_HEAD_INIT(mutexname.wait_list)}

DEFINE_MUTEX相关推荐

  1. 学习《Linux设备模型浅析之设备篇》笔记(三)

    文件/drivers/base/core.c static struct kobject *get_device_parent(struct device *dev, struct device *p ...

  2. JDK源码分析 NIO实现

    总列表:http://hg.openjdk.java.net/ 小版本:http://hg.openjdk.java.net/jdk8u jdk:http://hg.openjdk.java.net/ ...

  3. linux检查是否有D进程,Linux内核调试技术——进程D状态死锁检测

    Linux的进程存在多种状态,如TASK_RUNNING的运行态.EXIT_DEAD的停止态和 TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched ...

  4. linux 同步方法剖析,Linux 同步方法剖析

    级别: 中级 M. Tim Jones (), 顾问工程师, Emulex 2007 年 11 月 19 日在 学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(cri ...

  5. I.MX6 ar1020 SPI device driver hacking

    /************************************************************************************* I.MX6 ar1020 ...

  6. Linux 内核里的“智能指针”【转】

    转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...

  7. linux 内核 hook函数介绍

    在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...

  8. 详解神秘Linux内核

    在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念. 我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这次 ...

  9. 内核同步机制——互斥量

    互斥量 数组结构:structmutex. 静态定义: DEFINE_MUTEX(name); 动态初始化: mutex_init(&mutex); 操作: mutex_lock(&m ...

  10. Linux 内核里的“智能指针”

    Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...

最新文章

  1. Java IO: Buffered和Data
  2. Oracle 11g R2 RAC 高可用连接特性
  3. Apache ECharts各种图表页面展示
  4. linux下安装mysql-5.6.41
  5. C++ Qt全局异常处理器_QT教程
  6. ajax请求l类型,jquery 的ajax请求示例和注意事项
  7. 华为机试——计算字符个数
  8. 使用Oracle 11g新特性 Active Database Duplication 搭建Dataguard环境
  9. ubuntu 压缩率最高的软件_[图]Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4
  10. 微信小程序获取二维码scene参数报错 41030:invalid page rid: xx-xx-xx
  11. CSS-线性渐变无畸变-环形普通进度条-环形能量块进度条-局部环形普通进度条
  12. spine 导出纹理_Spine入门 —— 纹理打包
  13. 蓦然回首,你想要的就在这里
  14. 虚拟网卡服务器端软件,不再挤房间!自己动手架设自己的“浩方”对战平台
  15. 计算机技术服务的增值税税率,咨询系统集成技术服务税率
  16. 热力图pycharm
  17. 计算机怎么搜索特定格式文件,win10 查找指定类型文件方法_win10怎么查找指定类型文件-win7之家...
  18. HTTP协议-get与post请求
  19. 《外星人入侵》 教程详解
  20. 弘辽科技:淘宝销量数据从哪查?销量怎么提升?

热门文章

  1. C# 不借助第三个变量实现两整数交换
  2. python垃圾回收机制gcgo_python垃圾处理机制
  3. 腾讯正式开源高性能Hybrid框架VasSonic!
  4. 用于物联网数据收集和传输的边缘网络密钥
  5. 概览Visual Studio 15.3的第二个预览版
  6. MySQL编译安装时常见错误分析
  7. Vue.js 系列教程 5:动画
  8. 在RichEdit中插入GIF图片的方法
  9. WinCE6.0下TCPMP的BenchMark汇总
  10. ColorTransform类应用实例:鼠标经过时使图片发光。