XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
信号量 的协作图:

结构体

struct  xwos_sem
 XWOS API:信号量对象 更多...
 
struct  xwos_sem_d
 XWOS API:信号量对象描述符 更多...
 

宏定义

#define XWOS_SEM_NILD   ((xwos_sem_d){NULL, 0,})
 XWOS API:空的信号量对象描述符
 

函数

static xwer_t xwos_sem_init (struct xwos_sem *sem, xwssq_t val, xwssq_t max)
 XWOS API:静态方式初始化信号量对象
 
static xwer_t xwos_sem_fini (struct xwos_sem *sem)
 XWOS API:销毁静态方式初始化的信号量对象
 
static xwer_t xwos_sem_grab (struct xwos_sem *sem)
 XWOS API:增加信号量对象的引用计数
 
static xwer_t xwos_sem_put (struct xwos_sem *sem)
 XWOS API:减少信号量对象的引用计数
 
static xwer_t xwos_sem_create (xwos_sem_d *semd, xwssq_t val, xwssq_t max)
 XWOS API:动态方式创建信号量对象
 
static xwer_t xwos_sem_delete (xwos_sem_d semd)
 XWOS API:删除动态方式创建的信号量对象
 
static xwer_t xwos_sem_acquire (xwos_sem_d semd)
 XWOS API:检查信号量对象的标签并增加引用计数
 
static xwer_t xwos_sem_release (xwos_sem_d semd)
 XWOS API:检查对象的标签并减少引用计数
 
static xwsq_t xwos_sem_get_tik (struct xwos_sem *sem)
 XWOS API:获取信号量对象的标签
 
static xwos_sem_d xwos_sem_get_d (struct xwos_sem *sem)
 XWOS API:获取信号量对象描述符
 
static xwer_t xwos_sem_bind (struct xwos_sem *sem, struct xwos_sel *sel, xwsq_t pos)
 XWOS API:绑定信号量对象到信号选择器
 
static xwer_t xwos_sem_unbind (struct xwos_sem *sem, struct xwos_sel *sel)
 XWOS API:从信号选择器上解绑信号量对象
 
static xwer_t xwos_sem_freeze (struct xwos_sem *sem)
 XWOS API:冻结信号量对象
 
static xwer_t xwos_sem_thaw (struct xwos_sem *sem)
 XWOS API:解冻信号量对象
 
static xwer_t xwos_sem_post (struct xwos_sem *sem)
 XWOS API:发布信号量
 
static xwer_t xwos_sem_wait (struct xwos_sem *sem)
 XWOS API:等待并获取信号量
 
static xwer_t xwos_sem_wait_to (struct xwos_sem *sem, xwtm_t to)
 XWOS API:限时等待并获取信号量
 
static xwer_t xwos_sem_wait_unintr (struct xwos_sem *sem)
 XWOS API:等待并获取信号量,且等待不可被中断
 
static xwer_t xwos_sem_trywait (struct xwos_sem *sem)
 XWOS API:尝试获取信号量
 
static xwer_t xwos_sem_get_max (struct xwos_sem *sem, xwssq_t *max)
 XWOS API:获取信号量对象计数器的最大值
 
static xwer_t xwos_sem_get_value (struct xwos_sem *sem, xwssq_t *val)
 XWOS API:获取信号量对象计数器的值
 

详细描述

技术参考手册: 信号量

信号量的静态初始化、销毁

信号量的动态创建、删除

发布信号量

等待信号量

获取信号量的状态

冻结与解冻信号量

使用信号选择器选择信号量

信号量对象的生命周期管理

对象描述符和对象标签

已知信号量对象的指针的情况下,可以通过 xwos_sem_get_d() 获取 xwos_sem_d , 或可以通过 xwos_sem_get_tik() 获取对象标签。

C++

C++头文件: xwos/osal/sync/sem.hxx

宏定义说明

◆ XWOS_SEM_NILD

#define XWOS_SEM_NILD   ((xwos_sem_d){NULL, 0,})

XWOS API:空的信号量对象描述符

在文件 sem.h110 行定义.

函数说明

◆ xwos_sem_acquire()

static xwer_t xwos_sem_acquire ( xwos_sem_d  semd)
inlinestatic

XWOS API:检查信号量对象的标签并增加引用计数

参数
[in]semd信号量对象描述符
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败
注解
  • 上下文:任意

在文件 sem.h229 行定义.

230{
231 return xwosdl_sem_acquire(&semd.sem->ossem, semd.tik);
232}
struct xwos_sem * sem
Definition sem.h:103
xwsq_t tik
Definition sem.h:104
struct xwmp_sem ossem
Definition sem.h:96

◆ xwos_sem_bind()

static xwer_t xwos_sem_bind ( struct xwos_sem sem,
struct xwos_sel sel,
xwsq_t  pos 
)
inlinestatic

XWOS API:绑定信号量对象到信号选择器

参数
[in]sem信号量对象的指针
[in]sel信号选择器的指针
[in]pos信号量对象映射到位图中的位置
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ECHRNG位置超出范围
-EALREADY同步对象已经绑定到事件对象
-EBUSY通道已经被其他同步对象独占
注解
  • 上下文:任意
  • 绑定方式:独占绑定

在文件 sem.h297 行定义.

298{
299 return xwosdl_sem_bind(&sem->ossem, &sel->ossel, pos);
300}
struct xwmp_evt ossel
Definition sel.h:82
这是这个函数的调用关系图:

◆ xwos_sem_create()

static xwer_t xwos_sem_create ( xwos_sem_d semd,
xwssq_t  val,
xwssq_t  max 
)
inlinestatic

XWOS API:动态方式创建信号量对象

参数
[out]semd指向缓冲区的指针,通过此缓冲区返回信号量对象描述符
[in]val信号量的初始值
[in]max信号量的最大值
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINVAL无效参数
-ENOMEM内存不足
注解
  • 上下文:任意

在文件 sem.h197 行定义.

198{
199 return xwosdl_sem_create((xwosdl_sem_d *)semd, val, max);
200}

◆ xwos_sem_delete()

static xwer_t xwos_sem_delete ( xwos_sem_d  semd)
inlinestatic

XWOS API:删除动态方式创建的信号量对象

参数
[in]semd信号量对象描述符
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
注解
  • 上下文:任意

在文件 sem.h212 行定义.

213{
214 return xwosdl_sem_delete(&semd.sem->ossem, semd.tik);
215}

◆ xwos_sem_fini()

static xwer_t xwos_sem_fini ( struct xwos_sem sem)
inlinestatic

XWOS API:销毁静态方式初始化的信号量对象

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
注解
  • 上下文:任意

在文件 sem.h140 行定义.

141{
142 return xwosdl_sem_fini(&sem->ossem);
143}
这是这个函数的调用关系图:

◆ xwos_sem_freeze()

static xwer_t xwos_sem_freeze ( struct xwos_sem sem)
inlinestatic

XWOS API:冻结信号量对象

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EALREADY信号量对象已被冻结
注解
  • 上下文:任意

被冻结的信号量对象不允许增加(V操作),但可以被测试(P操作)。 测试信号量对象的线程会被加入到信号量对象的等待队列。

对已经冻结的信号量再次冻结,将返回 -EALREADY

在文件 sem.h335 行定义.

336{
337 return xwosdl_sem_freeze(&sem->ossem);
338}
这是这个函数的调用关系图:

◆ xwos_sem_get_d()

static xwos_sem_d xwos_sem_get_d ( struct xwos_sem sem)
inlinestatic

XWOS API:获取信号量对象描述符

参数
[in]sem信号量对象的指针
返回
信号量对象描述符
注解
  • 上下文:任意

在文件 sem.h272 行定义.

273{
274 xwos_sem_d semd;
275
276 semd.sem = sem;
277 semd.tik = xwosdl_sem_get_tik(&sem->ossem);
278 return semd;
279}
XWOS API:信号量对象描述符
Definition sem.h:102

◆ xwos_sem_get_max()

static xwer_t xwos_sem_get_max ( struct xwos_sem sem,
xwssq_t max 
)
inlinestatic

XWOS API:获取信号量对象计数器的最大值

参数
[in]sem信号量对象的指针
[out]max指向缓冲区的指针,通过此缓冲区返回信号量对象计数器的最大值
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
注解
  • 上下文:任意

在文件 sem.h470 行定义.

471{
472 return xwosdl_sem_get_max(&sem->ossem, max);
473}

◆ xwos_sem_get_tik()

static xwsq_t xwos_sem_get_tik ( struct xwos_sem sem)
inlinestatic

XWOS API:获取信号量对象的标签

参数
[in]sem信号量对象的指针
返回
信号量对象的标签
注解
  • 上下文:任意

在文件 sem.h259 行定义.

260{
261 return xwosdl_sem_get_tik(&sem->ossem);
262}

◆ xwos_sem_get_value()

static xwer_t xwos_sem_get_value ( struct xwos_sem sem,
xwssq_t val 
)
inlinestatic

XWOS API:获取信号量对象计数器的值

参数
[in]sem信号量对象的指针
[out]val指向缓冲区的指针,通过此缓冲区返回信号量对象计数器的值
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
注解
  • 上下文:任意

在文件 sem.h486 行定义.

487{
488 return xwosdl_sem_get_value(&sem->ossem, val);
489}

◆ xwos_sem_grab()

static xwer_t xwos_sem_grab ( struct xwos_sem sem)
inlinestatic

XWOS API:增加信号量对象的引用计数

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EOBJDEAD对象无效
注解
  • 上下文:任意

此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。

在文件 sem.h159 行定义.

160{
161 return xwosdl_sem_grab(&sem->ossem);
162}

◆ xwos_sem_init()

static xwer_t xwos_sem_init ( struct xwos_sem sem,
xwssq_t  val,
xwssq_t  max 
)
inlinestatic

XWOS API:静态方式初始化信号量对象

参数
[in]sem信号量对象的指针
[in]val信号量的初始值
[in]max信号量的最大值
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINVAL无效参数
注解
  • 上下文:任意

在文件 sem.h125 行定义.

126{
127 return xwosdl_sem_init(&sem->ossem, val, max);
128}
这是这个函数的调用关系图:

◆ xwos_sem_post()

static xwer_t xwos_sem_post ( struct xwos_sem sem)
inlinestatic

XWOS API:发布信号量

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENEGATIVE信号量对象已被冻结
-ERANGE信号量对象的值已经最大
注解
  • 上下文:任意

此函数只对未冻结的信号量对象起作用,已冻结的信号量对象将得到错误码 -ENEGATIVE

在文件 sem.h373 行定义.

374{
375 return xwosdl_sem_post(&sem->ossem);
376}
这是这个函数的调用关系图:

◆ xwos_sem_put()

static xwer_t xwos_sem_put ( struct xwos_sem sem)
inlinestatic

XWOS API:减少信号量对象的引用计数

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EOBJDEAD对象无效
注解
  • 上下文:任意

此函数主要用于管理 静态对象 的引用计数。 若用于 动态对象 ,需要确保对象的指针一定不是野指针。

在文件 sem.h178 行定义.

179{
180 return xwosdl_sem_put(&sem->ossem);
181}

◆ xwos_sem_release()

static xwer_t xwos_sem_release ( xwos_sem_d  semd)
inlinestatic

XWOS API:检查对象的标签并减少引用计数

参数
[in]semd信号量对象描述符
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败
注解
  • 上下文:任意

在文件 sem.h246 行定义.

247{
248 return xwosdl_sem_release(&semd.sem->ossem, semd.tik);
249}

◆ xwos_sem_thaw()

static xwer_t xwos_sem_thaw ( struct xwos_sem sem)
inlinestatic

XWOS API:解冻信号量对象

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EALREADY信号量对象未被冻结
注解
  • 上下文:任意

此函数只对已冻结的信号量对象起作用, 对未冻结的信号量对象调用此函数将返回错误码 -EALREADY

在文件 sem.h354 行定义.

355{
356 return xwosdl_sem_thaw(&sem->ossem);
357}
这是这个函数的调用关系图:

◆ xwos_sem_trywait()

static xwer_t xwos_sem_trywait ( struct xwos_sem sem)
inlinestatic

XWOS API:尝试获取信号量

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENODATA信号量对象资源不可用(信号量对象无法被获取)
注解
  • 上下文:任意

若没有检测到信号,立即返回错误码 -ENODATA ,不会阻塞。

在文件 sem.h454 行定义.

455{
456 return xwosdl_sem_trywait(&sem->ossem);
457}
这是这个函数的调用关系图:

◆ xwos_sem_unbind()

static xwer_t xwos_sem_unbind ( struct xwos_sem sem,
struct xwos_sel sel 
)
inlinestatic

XWOS API:从信号选择器上解绑信号量对象

参数
[in]sem信号量对象的指针
[in]sel信号选择器的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTCONN同步对象没有绑定到事件对象上
注解
  • 上下文:任意

在文件 sem.h314 行定义.

315{
316 return xwosdl_sem_unbind(&sem->ossem, &sel->ossel);
317}
这是这个函数的调用关系图:

◆ xwos_sem_wait()

static xwer_t xwos_sem_wait ( struct xwos_sem sem)
inlinestatic

XWOS API:等待并获取信号量

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDSPMPT抢占被关闭
-EDSBH中断底半部被关闭
注解
  • 上下文:线程

在文件 sem.h392 行定义.

393{
394 return xwosdl_sem_wait(&sem->ossem);
395}

◆ xwos_sem_wait_to()

static xwer_t xwos_sem_wait_to ( struct xwos_sem sem,
xwtm_t  to 
)
inlinestatic

XWOS API:限时等待并获取信号量

参数
[in]sem信号量对象的指针
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ETIMEDOUT超时
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDSPMPT抢占被关闭
-EDSBH中断底半部被关闭
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

在文件 sem.h418 行定义.

419{
420 return xwosdl_sem_wait_to(&sem->ossem, to);
421}
这是这个函数的调用关系图:

◆ xwos_sem_wait_unintr()

static xwer_t xwos_sem_wait_unintr ( struct xwos_sem sem)
inlinestatic

XWOS API:等待并获取信号量,且等待不可被中断

参数
[in]sem信号量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTTHDCTX不在线程上下文中
-EDSPMPT抢占被关闭
-EDSBH中断底半部被关闭
注解
  • 上下文:线程

在文件 sem.h436 行定义.

437{
438 return xwosdl_sem_wait_unintr(&sem->ossem);
439}
这是这个函数的调用关系图: