技术参考手册: 互斥锁
互斥锁的静态初始化、销毁
互斥锁的动态创建、删除
解锁
上锁
获取锁状态
互斥锁对象的生命周期管理
- 通过 对象指针 管理生命周期:
- 通过 对象描述符 管理生命周期:
对象描述符和对象标签
已知互斥锁对象的指针的情况下,可以通过 xwos_mtx_get_d()
获取 xwos_mtx_d , 或可以通过 xwos_mtx_get_tik()
获取对象标签。
C++
C++头文件: xwos/osal/lock/mtx.hxx
◆ XWOS_MTX_NILD
XWOS API:空的互斥锁对象描述符
在文件 mtx.h 第 97 行定义.
◆ xwos_mtx_acquire()
XWOS API:检查互斥锁对象的标签并增加引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-ENILOBJD | 空的对象描述符 |
-EOBJDEAD | 对象无效 |
-EACCES | 对象标签检查失败 |
- 注解
-
在文件 mtx.h 第 214 行定义.
215{
216 return xwosdl_mtx_acquire(&mtxd.
mtx->
osmtx, mtxd.
tik);
217}
◆ xwos_mtx_create()
XWOS API:动态方式创建互斥锁
- 参数
-
[out] | mtxd | 指向缓冲区的指针,通过此缓冲区返回互斥锁对象描述符 |
[in] | sprio | 互斥锁的静态优先级 |
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EINVAL | 无效参数 |
-ENOMEM | 内存不足 |
- 注解
-
在文件 mtx.h 第 182 行定义.
183{
184 return xwosdl_mtx_create((xwosdl_mtx_d *)mtxd, sprio);
185}
◆ xwos_mtx_delete()
XWOS API:删除动态方式创建的互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
- 注解
-
在文件 mtx.h 第 197 行定义.
198{
199 return xwosdl_mtx_delete(&mtxd.
mtx->
osmtx, mtxd.
tik);
200}
◆ xwos_mtx_fini()
XWOS API:销毁静态方式初始化的互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
- 注解
-
在文件 mtx.h 第 126 行定义.
127{
128 return xwosdl_mtx_fini(&mtx->
osmtx);
129}
◆ xwos_mtx_get_d()
XWOS API:获取互斥锁对象的描述符
- 参数
-
- 返回
- 互斥锁对象的描述符
- 注解
-
在文件 mtx.h 第 257 行定义.
258{
260
262 mtxd.
tik = xwosdl_mtx_get_tik(&mtx->
osmtx);
263 return mtxd;
264}
◆ xwos_mtx_get_status()
XWOS API:获取锁的状态
- 参数
-
[in] | mtx | 互斥锁对象的指针 |
[out] | status | 指向缓冲区的指针,通过此缓冲区返回锁的状态 |
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 空指针 |
-EOBJDEAD | 互斥锁对象无效 |
- 注解
-
在文件 mtx.h 第 387 行定义.
388{
389 return xwosdl_mtx_get_status(&mtx->
osmtx, lkst);
390}
◆ xwos_mtx_get_tik()
XWOS API:获取互斥锁对象的标签
- 参数
-
- 返回
- 互斥锁对象的标签
- 注解
-
在文件 mtx.h 第 244 行定义.
245{
246 return xwosdl_mtx_get_tik(&mtx->
osmtx);
247}
◆ xwos_mtx_grab()
XWOS API:增加互斥锁对象的引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 空指针 |
-EOBJDEAD | 对象无效 |
- 注解
-
此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。
在文件 mtx.h 第 145 行定义.
146{
147 return xwosdl_mtx_grab(&mtx->
osmtx);
148}
◆ xwos_mtx_init()
XWOS API:静态方式初始化互斥锁
- 参数
-
[in] | mtx | 互斥锁的指针 |
[in] | sprio | 互斥锁的静态优先级 |
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EINVAL | 无效参数 |
- 注解
-
在文件 mtx.h 第 111 行定义.
112{
113 return xwosdl_mtx_init(&mtx->
osmtx, sprio);
114}
◆ xwos_mtx_lock()
XWOS API:等待并上锁互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EOBJDEAD | 互斥锁对象无效 |
-EINTR | 等待被中断 |
-ENOTTHDCTX | 不在线程上下文中 |
-EDSPMPT | 抢占被关闭 |
-EDSBH | 中断底半部被关闭 |
- 注解
-
- 如果无法上锁,调用此CAPI的线程会阻塞等待,直到互斥锁可被上锁,或等待被中断。
- 线程的阻塞等待可能被中断,此时,API返回
-EINTR
。
在文件 mtx.h 第 302 行定义.
303{
304 return xwosdl_mtx_lock(&mtx->
osmtx);
305}
◆ 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 第 329 行定义.
330{
331 return xwosdl_mtx_lock_to(&mtx->
osmtx, to);
332}
◆ xwos_mtx_lock_unintr()
XWOS API:等待并上锁互斥锁,且等待不可被中断
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EOBJDEAD | 互斥锁对象无效 |
-ENOTTHDCTX | 不在线程上下文中 |
-EDSPMPT | 抢占被关闭 |
-EDSBH | 中断底半部被关闭 |
- 注解
-
在文件 mtx.h 第 348 行定义.
349{
350 return xwosdl_mtx_lock_unintr(&mtx->
osmtx);
351}
◆ xwos_mtx_put()
XWOS API:减少互斥锁对象的引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 空指针 |
-EOBJDEAD | 对象无效 |
- 注解
-
此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。
在文件 mtx.h 第 164 行定义.
165{
166 return xwosdl_mtx_put(&mtx->
osmtx);
167}
◆ xwos_mtx_release()
XWOS API:检查对象的标签并减少引用计数
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-ENILOBJD | 空的对象描述符 |
-EOBJDEAD | 对象无效 |
-EACCES | 对象标签检查失败 |
- 注解
-
在文件 mtx.h 第 231 行定义.
232{
233 return xwosdl_mtx_release(&mtxd.
mtx->
osmtx, mtxd.
tik);
234}
◆ xwos_mtx_trylock()
XWOS API:尝试上锁互斥锁,不会阻塞调用线程
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EOBJDEAD | 互斥锁对象无效 |
-EWOULDBLOCK | 尝试获取锁失败 |
-ENOTTHDCTX | 不在线程上下文中 |
- 注解
-
此函数虽然不会阻塞调用线程,但也不可在中断上下文中使用, 因为在OS中互斥锁通常需要记录自己的拥有者(一般是线程对象结构体), 中断上下文不存在对应的线程对象结构体。
在文件 mtx.h 第 370 行定义.
371{
372 return xwosdl_mtx_trylock(&mtx->
osmtx);
373}
◆ xwos_mtx_unlock()
XWOS API:解锁互斥锁
- 参数
-
- 返回
- 错误码
- 返回值
-
XWOK | 没有错误 |
-EFAULT | 无效的指针或空指针 |
-EOBJDEAD | 互斥锁对象无效 |
-EOWNER | 线程并没有锁定此互斥锁 |
-ENOTTHDCTX | 不在线程上下文中 |
- 注解
-
在文件 mtx.h 第 279 行定义.
280{
281 return xwosdl_mtx_unlock(&mtx->
osmtx);
282}