读写信号量

当出现多个读者,单个写者的情况时,单纯地使用互斥信号量将极大地减弱多线程操作系统的处理性能。为了满足这种高并发的处理速度问题,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
 

猜你喜欢

转载自blog.csdn.net/Liangren_/article/details/109304136