Class condsp

XWLUA类:条件量对象强指针

条件量对象强指针是Lua语言中的一种 userdata ,用于 强引用 XWOS的条件量对象。

强引用 表示会增加XWOS的条件量对象的 引用计数

MetaMethods

condsp:metatable.__copy (condsp, vm) 元方法:__copy
condsp:metatable.__gc (condsp) 元方法:__gc
condsp:metatable.__tostring (condsp) 元方法:__tostring

Methods

condsp:bind (condsp, sel, pos) 绑定条件量对象到信号选择器
condsp:unbind (condsp, sel) 从信号选择器上解绑条件量对象
condsp:freeze (condsp) 冻结条件量
condsp:thaw (condsp) 解冻条件量
condsp:unicast (condsp) 单播条件量对象,只会唤醒第一个线程
condsp:broadcast (condsp) 广播条件量对象,等待队列中的所有线程都会被唤醒
condsp:wait (condsp, lock) 等待并获取条件量
condsp:wait_to (condsp, lock, to) 限时阻塞当前线程,直到被条件量唤醒
condsp:wait_unintr (condsp, lock) 阻塞当前线程,直到被条件量唤醒,且阻塞不可被中断


MetaMethods

condsp:metatable.__copy (condsp, vm)
元方法:__copy

将条件量对象强指针拷贝到全局导出表 xwxt 中。

此元方法意味着条件量对象的强引用多了一个, 引用计数1

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • vm userdata (in) 目标虚拟机

Usage:

    condsp = ... -- 创建条件量的代码(省略)
    xwxt.somecond = condsp -- 条件量对象的引用计数加1
    condsp2 = xwxt.somecond -- 条件量对象的引用计数加1
    xwxt.somecond = nil -- 条件量对象的引用计数减1
condsp:metatable.__gc (condsp)
元方法:__gc

条件量对象强指针的垃圾回收方法。

此元方法意味着条件量对象的强引用少了一个, 引用计数1

Parameters:

  • condsp userdata (in) 条件量对象强指针

Usage:

    condsp = nil -- 删除引用
    collectgarbage() -- 强制垃圾回收,将调用__gc()函数
condsp:metatable.__tostring (condsp)
元方法:__tostring

将条件量对象强指针格式化成字符串,可用于终端打印调试。

Parameters:

  • condsp userdata (in) 条件量对象强指针

Usage:

    print(condsp)

Methods

condsp:bind (condsp, sel, pos)
绑定条件量对象到信号选择器

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • sel userdata (in) 信号选择器对象的强指针
  • pos number (in) 条件量对象映射到信号选择器位图中的位置,位置从 0 开始编号

Returns:

    number 错误码
     ● 0 没有错误
     ● -ECHRNG 位置超出范围
     ● -EALREADY 同步对象已经绑定到事件对象
     ● -EBUSY 通道已经被其他同步对象独占

Usage:

    cond = xwos.cond.new(0, 100)
    rc = cond:bind(sel, 3) -- 绑定到信号选择器的位置3
    if (rc == 0) then
      -- 绑定成功
    else
      -- 绑定失败
    end
condsp:unbind (condsp, sel)
从信号选择器上解绑条件量对象

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • sel userdata (in) 信号选择器对象的强指针

Returns:

    number 错误码
     ● 0 没有错误
     ● -ENOTCONN 同步对象没有绑定到事件对象上

Usage:

    cond:unbind(sel)
condsp:freeze (condsp)
冻结条件量

Parameters:

  • condsp userdata (in) 条件量对象强指针

Returns:

    number 错误码
     ● 0 没有错误
     ● -EALREADY 条件量对象已被冻结

Usage:

    cond:freeze()
condsp:thaw (condsp)
解冻条件量

Parameters:

  • condsp userdata (in) 条件量对象强指针

Returns:

    number 错误码
     ● 0 没有错误
     ● -EALREADY 条件量对象已被冻结

Usage:

    cond:thaw()
condsp:unicast (condsp)
单播条件量对象,只会唤醒第一个线程

Parameters:

  • condsp userdata (in) 条件量对象强指针

Returns:

    number 错误码
     ● 0 没有错误
     ● -ENEGATIVE 条件量对象已被冻结

Usage:

    cond:unicast()
condsp:broadcast (condsp)
广播条件量对象,等待队列中的所有线程都会被唤醒

Parameters:

  • condsp userdata (in) 条件量对象强指针

Returns:

    number 错误码
     ● 0 没有错误
     ● -ENEGATIVE 条件量对象已被冻结

Usage:

    cond:broadcast()
condsp:wait (condsp, lock)
等待并获取条件量

条件量的等待,可以附加 操作:
 ● 当线程进入 等待 状态时,自动解锁;
 ● 当条件成立,成功返回 0 时,自动上锁;
 ● 当等待失败,返回错误码时,不会上锁。

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • lock userdata (in , optional) 锁对象的强引用指针
     ● splksp 自旋锁
     ● sqlksp 顺序锁
     ● mtxsp 互斥锁
     ● nil 无锁
     ● 省略 无锁

Returns:

    number 错误码
     ● 0 没有错误
     ● -EINVAL 参数错误
     ● -EINTR 等待被中断
     ● -ENOTTHDCTX 不在线程上下文中

Usage:

  • mycond = xwos.cond.new()
    rc = mycond:wait()
    if (rc == 0) then
      -- 条件成立
    elseif (rc == -4) then
      -- 等待被中断
    else
      -- 其他错误发生
    end
  • mylock = xwos.splk.new()
    mycond = xwos.cond.new()
    mylock:lock()
    -- 临界区
    rc = mycond:wait(mylock)
    if (rc == 0) then
      -- 条件成立, mylock 已上锁
      -- 临界区
      mylock:unlock()
    elseif (rc == -4) then
      -- 等待被中断, mylock 未上锁
    else
      -- 其他错误发生, mylock 未上锁
    end
condsp:wait_to (condsp, lock, to)
限时阻塞当前线程,直到被条件量唤醒

条件量的等待,可以附加 操作:
 ● 当线程进入 等待 状态时,自动解锁;
 ● 当条件成立,成功返回 0 时,自动上锁;
 ● 当等待失败,返回错误码时,不会上锁。

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • lock userdata (in , optional) 锁对象的强引用指针
     ● splksp 自旋锁
     ● sqlksp 顺序锁
     ● mtxsp 互斥锁
     ● nil 无锁
     ● 省略 无锁,省略此参数时,后面一个参数也被省略
  • to number (in , optional) 期望的阻塞等待时间,省略时表示最大时间

Returns:

    number 错误码
     ● 0 没有错误
     ● -EINVAL 参数错误
     ● -EINTR 等待被中断
     ● -ENOTTHDCTX 不在线程上下文中
     ● -ETIMEDOUT 超时

Usage:

  • mycond = xwos.cond.new()
    rc = mycond:wait_to() -- 不包括锁操作,无限等待
    if (rc == 0) then
      -- 条件成立
    elseif (rc == -4) then
      -- 等待被中断
    else
      -- 其他错误发生
    end
  • mycond = xwos.cond.new()
    rc = mycond:wait_to(nil, xwtm.ft(xwt,.s(1))) -- 不包括锁操作,最多等待1s
    if (rc == 0) then
      -- 条件成立
    elseif (rc == -116) then
      -- 超时
    elseif (rc == -4) then
      -- 等待被中断
    else
      -- 其他错误发生
    end
  • mymtx = xwos.mtx.new()
    mycond = xwos.cond.new()
    mymtx:lock()
    -- 临界区
    rc = mycond:wait_to(mymtx, xwtm.ft(xwt,.s(1))) -- 包括互斥锁操作,最多等待1s
    if (rc == 0) then
      -- 条件成立, mymtx 已上锁
      -- 临界区
      mymtx:unlock()
    elseif (rc == -4) then
      -- 等待被中断, mymtx 未上锁
    elseif (rc == -116) then
      -- 超时, mymtx 未上锁
    else
      -- 其他错误发生, mymtx 未上锁
    end
condsp:wait_unintr (condsp, lock)
阻塞当前线程,直到被条件量唤醒,且阻塞不可被中断

条件量的等待,可以附加 操作:
 ● 当线程进入 等待 状态时,自动解锁;
 ● 当条件成立,成功返回 0 时,自动上锁;
 ● 当等待失败,返回错误码时,不会上锁。

Parameters:

  • condsp userdata (in) 条件量对象强指针
  • lock userdata (in , optional) 锁对象的强引用指针
     ● splksp 自旋锁
     ● sqlksp 顺序锁
     ● mtxsp 互斥锁
     ● nil 无锁
     ● 省略 无锁

Returns:

    number 错误码
     ● 0 没有错误
     ● -EINVAL 参数错误
     ● -ENOTTHDCTX 不在线程上下文中

Usage:

  • mycond = xwos.cond.new()
    rc = mycond:wait_unintr()
    if (rc == 0) then
      -- 条件成立
    else
      -- 其他错误发生
    end
  • mylock = xwos.sqlk.new()
    mycond = xwos.cond.new()
    mylock:wr_lock()
    -- 写临界区
    rc = mycond:wait_unintr(mylock)
    if (rc == 0) then
      -- 条件成立, mylock 已上写锁
      -- 写临界区
      mylock:wr_unlock()
    else
      -- 其他错误发生, mylock 未写锁
    end
generated by LDoc 1.5.0 Last updated 2024-12-17 12:17:46