XWOS API  3.0
XWOS API参考手册
载入中...
搜索中...
未找到
条件量 的协作图:

结构体

struct  xwos_cond
 XWOS API:条件量对象 更多...
 
struct  xwos_cond_d
 XWOS API:条件量对象描述符 更多...
 

宏定义

#define XWOS_COND_NILD   ((xwos_cond_d){NULL, 0,})
 XWOS API:空的条件量对象描述符
 

函数

static xwer_t xwos_cond_init (struct xwos_cond *cond)
 XWOS API:静态方式初始化条件量对象
 
static xwer_t xwos_cond_fini (struct xwos_cond *cond)
 XWOS API:销毁静态方式初始化的条件量对象
 
static xwer_t xwos_cond_grab (struct xwos_cond *cond)
 XWOS API:增加条件量对象的引用计数
 
static xwer_t xwos_cond_put (struct xwos_cond *cond)
 XWOS API:减少条件量对象的引用计数
 
static xwer_t xwos_cond_create (xwos_cond_d *condd)
 XWOS API:动态方式创建条件量对象
 
static xwer_t xwos_cond_delete (xwos_cond_d condd)
 XWOS API:删除动态方式创建的条件量对象
 
static xwer_t xwos_cond_acquire (xwos_cond_d condd)
 XWOS API:检查条件量对象的标签并增加引用计数
 
static xwer_t xwos_cond_release (xwos_cond_d condd)
 XWOS API:检查对象的标签并减少引用计数
 
static xwsq_t xwos_cond_get_tik (struct xwos_cond *cond)
 XWOS API:获取条件量对象的标签
 
static xwos_cond_d xwos_cond_get_d (struct xwos_cond *cond)
 XWOS API:获取条件量对象描述符
 
static xwer_t xwos_cond_bind (struct xwos_cond *cond, struct xwos_sel *sel, xwsq_t pos)
 XWOS API:绑定条件量对象到信号选择器
 
static xwer_t xwos_cond_unbind (struct xwos_cond *cond, struct xwos_sel *sel)
 XWOS API:从信号选择器上解绑条件量对象
 
static xwer_t xwos_cond_freeze (struct xwos_cond *cond)
 XWOS API:冻结条件量对象
 
static xwer_t xwos_cond_thaw (struct xwos_cond *cond)
 XWOS API:解冻条件量对象
 
static xwer_t xwos_cond_broadcast (struct xwos_cond *cond)
 XWOS API:广播条件量对象,等待队列中的所有线程都会被唤醒
 
static xwer_t xwos_cond_unicast (struct xwos_cond *cond)
 XWOS API:单播条件量对象,只会唤醒第一个线程
 
static xwer_t xwos_cond_wait (struct xwos_cond *cond, union xwos_ulock lock, xwsq_t lktype, void *lkdata, xwsq_t *lkst)
 XWOS API:阻塞当前线程,直到被条件量唤醒
 
static xwer_t xwos_cond_wait_to (struct xwos_cond *cond, union xwos_ulock lock, xwsq_t lktype, void *lkdata, xwtm_t to, xwsq_t *lkst)
 XWOS API:限时阻塞当前线程,直到被条件量唤醒
 
static xwer_t xwos_cond_wait_unintr (struct xwos_cond *cond, union xwos_ulock lock, xwsq_t lktype, void *lkdata, xwsq_t *lkst)
 XWOS API:阻塞当前线程,直到被条件量唤醒,且阻塞不可被中断
 

详细描述

技术参考手册: 条件量

条件量的静态初始化、销毁

条件量的动态创建、删除

触发条件量

等待条件量

冻结与解冻条件量

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

条件量对象的生命周期管理

对象描述符和对象标签

已知条件量对象的指针的情况下,可以通过 xwos_cond_get_d() 获取 xwos_cond_d , 或可以通过 xwos_cond_get_tik() 获取对象标签。

C++

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

宏定义说明

◆ XWOS_COND_NILD

#define XWOS_COND_NILD   ((xwos_cond_d){NULL, 0,})

XWOS API:空的条件量对象描述符

在文件 cond.h105 行定义.

函数说明

◆ xwos_cond_acquire()

static xwer_t xwos_cond_acquire ( xwos_cond_d  condd)
inlinestatic

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

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

在文件 cond.h217 行定义.

218{
219 return xwosdl_cond_acquire(&condd.cond->oscond, condd.tik);
220}
xwsq_t tik
Definition cond.h:99
struct xwos_cond * cond
Definition cond.h:98
struct xwmp_cond oscond
Definition cond.h:91

◆ xwos_cond_bind()

static xwer_t xwos_cond_bind ( struct xwos_cond cond,
struct xwos_sel sel,
xwsq_t  pos 
)
inlinestatic

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

参数
[in]cond条件量对象的指针
[in]sel信号选择器的指针
[in]pos条件量对象映射到位图中的位置
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-ECHRNG位置超出范围
-EALREADY同步对象已经绑定到事件对象
-EBUSY通道已经被其他同步对象独占
注解
  • 上下文:任意
  • 绑定方式:非独占绑定
  • 绑定了信号选择器的条件量对象,只有 广播 才会向信号选择器发送信号。

在文件 cond.h286 行定义.

287{
288 return xwosdl_cond_bind(&cond->oscond, &sel->ossel, pos);
289}
struct xwmp_evt ossel
Definition sel.h:82

◆ xwos_cond_broadcast()

static xwer_t xwos_cond_broadcast ( struct xwos_cond cond)
inlinestatic

XWOS API:广播条件量对象,等待队列中的所有线程都会被唤醒

参数
[in]cond条件量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-ENEGATIVE条件量对象已被冻结
注解
  • 上下文:任意

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

在文件 cond.h361 行定义.

362{
363 return xwosdl_cond_broadcast(&cond->oscond);
364}

◆ xwos_cond_create()

static xwer_t xwos_cond_create ( xwos_cond_d condd)
inlinestatic

XWOS API:动态方式创建条件量对象

参数
[out]condd指向缓冲区的指针,通过此缓冲区返回条件量对象描述符
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
注解
  • 上下文:任意

在文件 cond.h185 行定义.

186{
187 return xwosdl_cond_create((xwosdl_cond_d *)condd);
188}

◆ xwos_cond_delete()

static xwer_t xwos_cond_delete ( xwos_cond_d  condd)
inlinestatic

XWOS API:删除动态方式创建的条件量对象

参数
[in]condd条件量对象描述符
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
注解
  • 上下文:任意

在文件 cond.h200 行定义.

201{
202 return xwosdl_cond_delete(&condd.cond->oscond, condd.tik);
203}

◆ xwos_cond_fini()

static xwer_t xwos_cond_fini ( struct xwos_cond cond)
inlinestatic

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

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

在文件 cond.h132 行定义.

133{
134 return xwosdl_cond_fini(&cond->oscond);
135}

◆ xwos_cond_freeze()

static xwer_t xwos_cond_freeze ( struct xwos_cond cond)
inlinestatic

XWOS API:冻结条件量对象

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

已冻结的条件量对象不允许单播或广播,但可以被等待, 测试条件量对象的线程会加入到条件量对象的等待队列中阻塞等待。

对已经冻结的条件量再次冻结,将返回 -EALREADY

在文件 cond.h324 行定义.

325{
326 return xwosdl_cond_freeze(&cond->oscond);
327}

◆ xwos_cond_get_d()

static xwos_cond_d xwos_cond_get_d ( struct xwos_cond cond)
inlinestatic

XWOS API:获取条件量对象描述符

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

在文件 cond.h260 行定义.

261{
262 xwos_cond_d condd;
263
264 condd.cond = cond;
265 condd.tik = xwosdl_cond_get_tik(&cond->oscond);
266 return condd;
267}
XWOS API:条件量对象描述符
Definition cond.h:97

◆ xwos_cond_get_tik()

static xwsq_t xwos_cond_get_tik ( struct xwos_cond cond)
inlinestatic

XWOS API:获取条件量对象的标签

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

在文件 cond.h247 行定义.

248{
249 return xwosdl_cond_get_tik(&cond->oscond);
250}

◆ xwos_cond_grab()

static xwer_t xwos_cond_grab ( struct xwos_cond cond)
inlinestatic

XWOS API:增加条件量对象的引用计数

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

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

在文件 cond.h151 行定义.

152{
153 return xwosdl_cond_grab(&cond->oscond);
154}

◆ xwos_cond_init()

static xwer_t xwos_cond_init ( struct xwos_cond cond)
inlinestatic

XWOS API:静态方式初始化条件量对象

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

在文件 cond.h117 行定义.

118{
119 return xwosdl_cond_init(&cond->oscond);
120}

◆ xwos_cond_put()

static xwer_t xwos_cond_put ( struct xwos_cond cond)
inlinestatic

XWOS API:减少条件量对象的引用计数

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

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

在文件 cond.h170 行定义.

171{
172 return xwosdl_cond_put(&cond->oscond);
173}

◆ xwos_cond_release()

static xwer_t xwos_cond_release ( xwos_cond_d  condd)
inlinestatic

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

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

在文件 cond.h234 行定义.

235{
236 return xwosdl_cond_release(&condd.cond->oscond, condd.tik);
237}

◆ xwos_cond_thaw()

static xwer_t xwos_cond_thaw ( struct xwos_cond cond)
inlinestatic

XWOS API:解冻条件量对象

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

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

在文件 cond.h343 行定义.

344{
345 return xwosdl_cond_thaw(&cond->oscond);
346}

◆ xwos_cond_unbind()

static xwer_t xwos_cond_unbind ( struct xwos_cond cond,
struct xwos_sel sel 
)
inlinestatic

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

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

在文件 cond.h303 行定义.

304{
305 return xwosdl_cond_unbind(&cond->oscond, &sel->ossel);
306}

◆ xwos_cond_unicast()

static xwer_t xwos_cond_unicast ( struct xwos_cond cond)
inlinestatic

XWOS API:单播条件量对象,只会唤醒第一个线程

参数
[in]cond条件量对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-ENEGATIVE条件量对象已被冻结
注解
  • 上下文:任意

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

在文件 cond.h379 行定义.

380{
381 return xwosdl_cond_unicast(&cond->oscond);
382}

◆ xwos_cond_wait()

static xwer_t xwos_cond_wait ( struct xwos_cond cond,
union xwos_ulock  lock,
xwsq_t  lktype,
void *  lkdata,
xwsq_t lkst 
)
inlinestatic

XWOS API:阻塞当前线程,直到被条件量唤醒

参数
[in]cond条件量对象的指针
[in]lock
[in]lktype锁的类型,取值:xwos_lock_type_em
[in]lkdata锁的数据
[out]lkst指向缓冲区的指针,通过此缓冲区返回锁的状态
  • XWOS_LKST_LOCKED :已上锁
  • XWOS_LKST_UNLOCKED :未上锁
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-EINVAL参数无效
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
注解
  • 上下文:线程
  • 所有锁统一使用 union xwlk_ulock 指代,此联合中包含所有锁的定义, 实际只是一个指针,有些锁还需要伴生数据 lkdata ,具体意义由 xwsq_t lktype 决定:
    • XWOS_LK_MTX :互斥锁
      • lock :代表互斥锁(访问方式: lock.osal.mtx );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SPLK :自旋锁
      • lock :代表自旋锁的指针(访问方式: lock.osal.splk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_WR :顺序写锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_RDEX :顺序独占读锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_CALLBACK :自定义的加锁与解锁函数
      • lock :代表指向 struct xwlk_cblk 的指针(访问方式: lock.cb );
      • lockdata :传递给 struct xwlk_cblk 中的 lockunlock 函数的参数;
  • lkst 用于返回锁的状态。XWOS的条件量在返回 XWOK 时,锁状态一定是是 **已上锁**, 但若返回错误码时,锁的状态不确定。

在文件 cond.h423 行定义.

426{
427 return xwosdl_cond_wait(&cond->oscond, lock, lktype, lkdata, lkst);
428}

◆ xwos_cond_wait_to()

static xwer_t xwos_cond_wait_to ( struct xwos_cond cond,
union xwos_ulock  lock,
xwsq_t  lktype,
void *  lkdata,
xwtm_t  to,
xwsq_t lkst 
)
inlinestatic

XWOS API:限时阻塞当前线程,直到被条件量唤醒

参数
[in]cond条件量对象的指针
[in]lock
[in]lktype锁的类型,取值:xwos_lock_type_em
[in]lkdata锁的数据
[in]to期望唤醒的时间点
[out]lkst指向缓冲区的指针,通过此缓冲区返回锁的状态
  • XWOS_LKST_LOCKED :已上锁
  • XWOS_LKST_UNLOCKED :未上锁
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-EINVAL参数无效
-ETIMEDOUT超时
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
注解
  • 上下文:线程
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT
  • 所有锁统一使用 union xwlk_ulock 指代,此联合中包含所有锁的定义, 实际只是一个指针,有些锁还需要伴生数据 lkdata ,具体意义由 xwsq_t lktype 决定:
    • XWOS_LK_MTX :互斥锁
      • lock :代表互斥锁(访问方式: lock.osal.mtx );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SPLK :自旋锁
      • lock :代表自旋锁的指针(访问方式: lock.osal.splk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_WR :顺序写锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_RDEX :顺序独占读锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_CALLBACK :自定义的加锁与解锁函数
      • lock :代表指向 struct xwlk_cblk 的指针(访问方式: lock.cb );
      • lockdata :传递给 struct xwlk_cblk 中的 lockunlock 函数的参数;
  • lkst 用于返回锁的状态。XWOS的条件量在返回 XWOK 时,锁状态一定是是 **已上锁**, 但若返回错误码时,锁的状态不确定。

在文件 cond.h472 行定义.

475{
476 return xwosdl_cond_wait_to(&cond->oscond, lock, lktype, lkdata, to, lkst);
477}

◆ xwos_cond_wait_unintr()

static xwer_t xwos_cond_wait_unintr ( struct xwos_cond cond,
union xwos_ulock  lock,
xwsq_t  lktype,
void *  lkdata,
xwsq_t lkst 
)
inlinestatic

XWOS API:阻塞当前线程,直到被条件量唤醒,且阻塞不可被中断

参数
[in]cond条件量对象的指针
[in]lock
[in]lktype锁的类型,取值:xwos_lock_type_em
[in]lkdata锁的数据
[out]lkst指向缓冲区的指针,通过此缓冲区返回锁的状态
  • XWOS_LKST_LOCKED :已上锁
  • XWOS_LKST_UNLOCKED :未上锁
返回
错误码
返回值
XWOK没有错误
-EFAULT无效的指针或空指针
-EINVAL参数无效
-ENOTTHDCTX不在线程上下文中
注解
  • 上下文:线程
  • 所有锁统一使用 union xwlk_ulock 指代,此联合中包含所有锁的定义, 实际只是一个指针,有些锁还需要伴生数据 lkdata ,具体意义由 xwsq_t lktype 决定:
    • XWOS_LK_MTX :互斥锁
      • lock :代表互斥锁(访问方式: lock.osal.mtx );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SPLK :自旋锁
      • lock :代表自旋锁的指针(访问方式: lock.osal.splk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_WR :顺序写锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_SQLK_RDEX :顺序独占读锁
      • lock :代表顺序锁的指针(访问方式: lock.osal.sqlk );
      • lockdata :无作用,设置为 NULL 即可;
    • XWOS_LK_CALLBACK :自定义的加锁与解锁函数
      • lock :代表指向 struct xwlk_cblk 的指针(访问方式: lock.cb );
      • lockdata :传递给 struct xwlk_cblk 中的 lockunlock 函数的参数;
  • lkst 用于返回锁的状态。XWOS的条件量在返回 XWOK 时,锁状态一定是是 **已上锁**, 但若返回错误码时,锁的状态不确定。

在文件 cond.h517 行定义.

520{
521 return xwosdl_cond_wait_unintr(&cond->oscond, lock, lktype, lkdata, lkst);
522}