# 互斥信号

TIP

  • MadMutex.h
  • MadMutex.c
类型 约定描述
MadMutexCB_t 互斥信号控制块
MadMutexCB_t* 互斥信号
MadMutexCB_t** 互斥信号指针

# MadOS 互斥信号类型

类型 描述
MAD_MUTEX_NORMAL 普通互斥信号
MAD_MUTEX_RECURSIVE 递归互斥信号

TIP

当线程获得某个递归互斥信号后,释放该互斥信号之前的所有等待操作将被忽略。

MadMutexCB_t *mutex = madMutexCreateRecursive();
madMutexWait(&mutex, 0);  // 首次获得互斥信号
madMutexWait(&mutex, 0);  // 不会造成线程阻塞
madMutexRelease(&mutex,); // 释放互斥信号
// { 假设: 互斥信号释放后立即被其他线程占用 }
madMutexWait(&mutex, 0);  // 线程阻塞
1
2
3
4
5
6

# madDoMutexCreate

MadMutexCB_t* madDoMutexCreate(MadU8 type, MadU8 flag)
1

新建互斥信号。

参数名 方向 说明
type in 互斥信号类型
flag in 互斥信号初始状态
返回值 说明
0 失败
NZ 成功(指向互斥信号控制块的指针)

flag

说明
0 初始处于锁定状态
x 初始处于解锁状态

# madDoMutexInit

MadBool madDoMutexInit(MadMutexCB_t *mutex, MadU8 type, MadU8 flag)
1

初始化互斥信号。

参数名 方向 说明
mutex in 互斥信号
type in 互斥信号类型
flag in 互斥信号初始状态
返回值 说明
MFALSE 失败
MTRUE 成功

flag

说明
0 初始处于锁定状态
x 初始处于解锁状态

# madMutexSetType

void madMutexSetType(MadMutexCB_t *mutex, MadU8 type)
1

设置互斥信号类型。

参数名 方向 说明
mutex in 互斥信号
type in 互斥信号类型

# madDoMutexRelease

void madDoMutexRelease(MadMutexCB_t **pMutex, MadU8 err)
1

释放互斥信号。

参数名 方向 说明
pMutex in 互斥信号指针
err in 释放互斥信号时的错误号(通常为MAD_ERR_OK)

# madMutexWait

MadU8 madMutexWait(MadMutexCB_t **pMutex, MadTim_t timOut)
1

等待互斥信号。

参数名 方向 说明
pMutex in 互斥信号指针
timOut in 等待超时的时间值(0则无时限)
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

# madMutexWaitInCritical

MadU8 madMutexWaitInCritical(MadMutexCB_t **pMutex, MadTim_t timOut)
1

等待互斥信号(谨慎使用)。

参数名 方向 说明
pMutex in 互斥信号指针
timOut in 等待超时的时间值(0则无时限)
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

TIP

  • 在临界区内被调用
  • 可能离开临界区使当前线程进入等待状态
  • 执行结束后回到临界区

# madMutexCheck

MadBool madMutexCheck(MadMutexCB_t **pMutex)
1

检查互斥信号是否可用。

参数名 方向 说明
pMutex in 互斥信号指针
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

# madDoMutexShut

void madDoMutexShut(MadMutexCB_t **pMutex, MadBool opt)
1

终止互斥信号(但不释放控制块所占用的内存)。

参数名 方向 说明
pMutex in 互斥信号指针
opt in 是否恢复等待线程

opt

说明
MTRUE 以 MAD_ERR_MUTEX_INVALID 为 err 释放互斥信号(恢复所有等待线程)
MFALSE 忽略所有等待线程

# madDoMutexDelete

void madDoMutexDelete(MadMutexCB_t **pMutex, MadBool opt)
1

删除互斥信号。

参数名 方向 说明
pMutex in 互斥信号指针
opt in 是否恢复等待线程

opt

说明
MTRUE 以 MAD_ERR_MUTEX_INVALID 为 err 释放互斥信号(恢复所有等待线程)
MFALSE 忽略所有等待线程

# madMutexCreate()

MadMutexCB_t* madDoMutexCreate(MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_NORMAL
flag 1

# madMutexCreateN()

MadMutexCB_t* madDoMutexCreate(MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_NORMAL
flag 0

# madMutexCreateRecursive()

MadMutexCB_t* madDoMutexCreate(MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_RECURSIVE
flag 1

# madMutexCreateRecursiveN()

MadMutexCB_t* madDoMutexCreate(MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_RECURSIVE
flag 0

# madMutexInit(mutex)

MadBool madDoMutexInit(MadMutexCB_t *mutex, MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_NORMAL
flag 1

# madMutexInitN(mutex)

MadBool madDoMutexInit(MadMutexCB_t *mutex, MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_NORMAL
flag 0

# madMutexInitRecursive(mutex)

MadBool madDoMutexInit(MadMutexCB_t *mutex, MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_RECURSIVE
flag 1

# madMutexInitRecursiveN(mutex)

MadBool madDoMutexInit(MadMutexCB_t *mutex, MadU8 type, MadU8 flag)
1
参数
type MAD_MUTEX_RECURSIVE
flag 0

# madMutexRelease(pMutex)

void madDoMutexRelease(MadMutexCB_t **pMutex, MadU8 err)
1
参数
err MAD_ERR_OK

# madMutexShut(pMutex)

void madDoMutexShut(MadMutexCB_t **pMutex, MadBool opt)
1
参数
opt MTRUE

# madMutexDelete(pMutex)

void madDoMutexDelete(MadMutexCB_t **pMutex, MadBool opt)
1
参数
opt MTRUE