读写信号量

当出现多个读者,单个写者的情况时,单纯地使用互斥信号量将极大地减弱多线程操作系统的处理性能。为了满足这种高并发的处理速度问题,SylixOS 引入了读写信号量,它的应用场景类似于 POSIX 读写锁。

SylixOS 读写信号量满足写优先的原则,也就是说,如果已经存在写信号量,则不能再申请读信号量,直到写信号量被释放。但是当已经存在读信号量时,可以再次请求读信号量。这种机制满足了读的高并发性。

 

1、Creat

一个 SylixOS 读写信号量必须要调用 Lw_SemaphoreRW_Create 函数创建之后才能使用,如果创建成功,该函数将返回一个读写信号量的句柄。

#include <SylixOS.h>
LW_HANDLE Lw_SemaphoreRW_Create(CPCHAR pcName, ULONG ulOption, LW_OBJECT_ID *pulId);
函数 Lw_SemaphoreRW_Create 原型分析:
  • 此函数成功返回读写信号量的句柄,失败返回 NULL 并设置错误号;
  • 参数 pcName 是读写信号量的名字;
  • 参数 ulOption 是读写信号量的创建选项;
  • 输出参数 pulId 返回读写信号量的句柄(同返回值),可以为 NULL

 

2、Delete

一个不再使用的读写信号量,可以调用以下函数将其删除。删除后的信号量系统自动回收其占用的系统资源(试图使用被删除的读写信号量将出现未知的错误)。

#include <SylixOS.h>
ULONG Lw_SemaphoreRW_Delete(LW_HANDLE *pulId);
函数 Lw_SemaphoreRW_Delete 原型分析:
  • 此函数成功返回 ERROR_NONE,失败返回错误号;
  • 参数 pulId 是读写信号量的句柄。

 

3、Wait

线程如果需要等待一个读信号量,可以调用 Lw_SemaphoreRW_RWait 函数,如果需要等待一个写信号量,可以调用 Lw_SemaphoreRW_WWait 函数。释放一个读写信号量使用Lw_SemaphoreRW_Post 函数。

#include <SylixOS.h>
ULONG Lw_SemaphoreRW_RWait(LW_HANDLE ulId, ULONG ulTimeout);
函数 Lw_SemaphoreRW_RWait 原型分析:
  • 此函数成功返回 ERROR_NONE,失败返回错误号;
  • 参数 ulId 是读信号量的句柄;
  • 参数 ulTimeout 是等待的超时时间,单位为时钟嘀嗒 Tick
#include <SylixOS.h>
ULONG Lw_SemaphoreRW_WWait(LW_HANDLE ulId, ULONG ulTimeout);
函数 Lw_SemaphoreRW_WWait 原型分析:
  • 此函数成功返回 ERROR_NONE,失败返回错误号;
  • 参数 ulId 是写信号量的句柄;
  • 参数 ulTimeout 是等待的超时时间,单位为时钟嘀嗒 Tick

 

4、Post

#include <SylixOS.h>
ULONG Lw_SemaphoreRW_Post(LW_HANDLE ulId);
函数 Lw_SemaphoreRW_Post 原型分析:
  • 此函数成功返回 ERROR_NONE,失败返回错误号;
  • 参数 ulId 是读写信号量的句柄。
需要注意的是,只有读写信号量的拥有者才能释放该读写信号量。
 

5、Status

调用以下函数可以获得读写信号量的详细信息:
 
#include <SylixOS.h>
ULONG Lw_SemaphoreRW_Status(LW_OBJECT_HANDLE ulId,
     ULONG *pulRWCount,
     ULONG *pulRPend,
     ULONG *pulWPend,
     ULONG *pulOption,
     LW_OBJECT_HANDLE *pulOwnerId);
函数 Lw_SemaphoreRW_Status 原型分析:
  • 此函数成功返回 ERROR_NONE,失败返回错误号;
  • 参数 ulId 是读写信号量的句柄;
  • 参数 pulRWCount 返回当前有多少线程正在并发操作读写信号量,此参数可以为 NULL
  • 参数 pulRPend 返回当前读操作阻塞的数量,此参数可以为 NULL
  • 参数 pulWPend 返回当前写操作阻塞的数量,此参数可以为 NULL
  • 参数 pulOption 返回当前读写信号量的选项信息,此参数可以为 NULL
  • 参数 pulOwnerId 返回当前写信号量的拥有者 ID,此参数可以为 NULL
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值