技术参考手册: 互斥锁
互斥锁的静态初始化、销毁
互斥锁的动态创建、删除
解锁
上锁
获取锁状态
互斥锁对象的生命周期管理
- 通过 对象指针 管理生命周期:
- 通过 对象描述符 管理生命周期:
对象描述符和对象标签
已知互斥锁对象的指针的情况下,可以通过 xwos_mtx_get_d() 获取 xwos_mtx_d , 或可以通过 xwos_mtx_get_tik() 获取对象标签。
◆ XWOS_MTX_NILD
XWOS API:空的互斥锁对象描述符
在文件 mtx.h 第 93 行定义.
◆ xwos_mtx_init()
XWOS API:静态方式初始化互斥锁
- 参数
-
| [in] | mtx | 互斥锁的指针 |
| [in] | sprio | 互斥锁的静态优先级 |
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EINVAL | 无效参数 |
- 注解
-
在文件 mtx.h 第 107 行定义.
108{
109 return xwosdl_mtx_init(&mtx->
osmtx, sprio);
110}
◆ xwos_mtx_fini()
XWOS API:销毁静态方式初始化的互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
- 注解
-
在文件 mtx.h 第 122 行定义.
123{
124 return xwosdl_mtx_fini(&mtx->
osmtx);
125}
◆ xwos_mtx_grab()
XWOS API:增加互斥锁对象的引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 空指针 |
| -EOBJDEAD | 对象无效 |
- 注解
-
此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。
在文件 mtx.h 第 141 行定义.
142{
143 return xwosdl_mtx_grab(&mtx->
osmtx);
144}
◆ xwos_mtx_put()
XWOS API:减少互斥锁对象的引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 空指针 |
| -EOBJDEAD | 对象无效 |
- 注解
-
此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。
在文件 mtx.h 第 160 行定义.
161{
162 return xwosdl_mtx_put(&mtx->
osmtx);
163}
◆ xwos_mtx_create()
XWOS API:动态方式创建互斥锁
- 参数
-
| [out] | mtxd | 指向缓冲区的指针,通过此缓冲区返回互斥锁对象描述符 |
| [in] | sprio | 互斥锁的静态优先级 |
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EINVAL | 无效参数 |
| -ENOMEM | 内存不足 |
- 注解
-
在文件 mtx.h 第 178 行定义.
179{
180 return xwosdl_mtx_create((xwosdl_mtx_d *)mtxd, sprio);
181}
◆ xwos_mtx_delete()
XWOS API:删除动态方式创建的互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
- 注解
-
在文件 mtx.h 第 193 行定义.
194{
195 return xwosdl_mtx_delete(&mtxd.
mtx->
osmtx, mtxd.
tik);
196}
◆ xwos_mtx_acquire()
XWOS API:检查互斥锁对象的标签并增加引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -ENILOBJD | 空的对象描述符 |
| -EOBJDEAD | 对象无效 |
| -EACCES | 对象标签检查失败 |
- 注解
-
在文件 mtx.h 第 210 行定义.
211{
212 return xwosdl_mtx_acquire(&mtxd.
mtx->
osmtx, mtxd.
tik);
213}
◆ xwos_mtx_release()
XWOS API:检查对象的标签并减少引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -ENILOBJD | 空的对象描述符 |
| -EOBJDEAD | 对象无效 |
| -EACCES | 对象标签检查失败 |
- 注解
-
在文件 mtx.h 第 227 行定义.
228{
229 return xwosdl_mtx_release(&mtxd.
mtx->
osmtx, mtxd.
tik);
230}
◆ xwos_mtx_get_tik()
XWOS API:获取互斥锁对象的标签
- 参数
-
- 返回
- 互斥锁对象的标签
- 注解
-
在文件 mtx.h 第 240 行定义.
241{
242 return xwosdl_mtx_get_tik(&mtx->
osmtx);
243}
◆ xwos_mtx_get_d()
XWOS API:获取互斥锁对象的描述符
- 参数
-
- 返回
- 互斥锁对象的描述符
- 注解
-
在文件 mtx.h 第 253 行定义.
254{
256
258 mtxd.
tik = xwosdl_mtx_get_tik(&mtx->
osmtx);
259 return mtxd;
260}
◆ xwos_mtx_unlock()
XWOS API:解锁互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
| -EOWNER | 线程并没有锁定此互斥锁 |
| -ENOTTHDCTX | 不在线程上下文中 |
- 注解
-
在文件 mtx.h 第 275 行定义.
276{
277 return xwosdl_mtx_unlock(&mtx->
osmtx);
278}
◆ xwos_mtx_lock()
XWOS API:等待并上锁互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
| -EINTR | 等待被中断 |
| -ENOTTHDCTX | 不在线程上下文中 |
| -EDSPMPT | 抢占被关闭 |
| -EDSBH | 中断底半部被关闭 |
- 注解
-
- 如果无法上锁,调用此CAPI的线程会阻塞等待,直到互斥锁可被上锁,或等待被中断。
- 线程的阻塞等待可能被中断,此时,API返回
-EINTR 。
在文件 mtx.h 第 298 行定义.
299{
300 return xwosdl_mtx_lock(&mtx->
osmtx);
301}
◆ xwos_mtx_lock_to()
XWOS API:限时等待上锁互斥锁
- 参数
-
| [in] | mtx | 互斥锁对象的指针 |
| [in] | to | 期望唤醒的时间点 |
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
| -EINTR | 等待被中断 |
| -ETIMEDOUT | 超时 |
| -ENOTTHDCTX | 不在线程上下文中 |
| -EDSPMPT | 抢占被关闭 |
| -EDSBH | 中断底半部被关闭 |
- 注解
-
to 表示等待超时的时间点:
to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
- 如果
to 是过去的时间点,将直接返回 -ETIMEDOUT 。
在文件 mtx.h 第 325 行定义.
326{
327 return xwosdl_mtx_lock_to(&mtx->
osmtx, to);
328}
◆ xwos_mtx_lock_unintr()
XWOS API:等待并上锁互斥锁,且等待不可被中断
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
| -ENOTTHDCTX | 不在线程上下文中 |
| -EDSPMPT | 抢占被关闭 |
| -EDSBH | 中断底半部被关闭 |
- 注解
-
在文件 mtx.h 第 344 行定义.
345{
346 return xwosdl_mtx_lock_unintr(&mtx->
osmtx);
347}
◆ xwos_mtx_trylock()
XWOS API:尝试上锁互斥锁,不会阻塞调用线程
- 参数
-
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 无效的指针或空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
| -EWOULDBLOCK | 尝试获取锁失败 |
| -ENOTTHDCTX | 不在线程上下文中 |
- 注解
-
此函数虽然不会阻塞调用线程,但也不可在中断上下文中使用, 因为在OS中互斥锁通常需要记录自己的拥有者(一般是线程对象结构体), 中断上下文不存在对应的线程对象结构体。
在文件 mtx.h 第 366 行定义.
367{
368 return xwosdl_mtx_trylock(&mtx->
osmtx);
369}
◆ xwos_mtx_get_status()
XWOS API:获取锁的状态
- 参数
-
| [in] | mtx | 互斥锁对象的指针 |
| [out] | status | 指向缓冲区的指针,通过此缓冲区返回锁的状态 |
- 返回
- 错误码
- 返回值
-
| XWOK | 没有错误 |
| -EFAULT | 空指针 |
| -EOBJDEAD | 互斥锁对象无效 |
- 注解
-
在文件 mtx.h 第 383 行定义.
384{
385 return xwosdl_mtx_get_status(&mtx->
osmtx, lkst);
386}