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