PV操作是计算机领域一个有名的术语。它由荷兰人Dijkstra提出,是一种典型的同步机制,P(荷兰语passeren)表示通过,V(荷兰语vrijgeven)表示释放。
POSIX定义的semaphore就是一种PV操作。VxWorks实现了以下函数
包含组件INCLUDE_POSIX_SEM及INCLUDE_POSIX_SEM_SHOW之后,试试相应的功能
- sem_init - 初始化无名semaphore,pSem非NULL,将semaphore赋值为value
- sem_destroy - 销毁没有task阻塞的无名semaphore;无名semaphore的生命周期为(sem_init, sem_destroy)
- semPxShow - 打印pSem的基本信息
- sem_getvalue - 读取pSem的值到pVal,负值表示阻塞的task数量。不过VxWorks在实现这个功能时,留了一个小bug:返回值仅表示有无阻塞,但跳过了对任务数量的统计
- sem_open - 创建或打开名字非NULL的semaphore。oflag取值O_CREAT,表示semaphore不存在则创建;此时sem_init()需提供第三个参数(未用到)和第四个参数(value);若同时使用O_EXCL,表示semaphore已存在则报错;
- sem_close - 关闭名字非NULL的semaphore;如果该semaphore之前已经被执行过sem_unlink,且这是最后一个sem_close,则销毁它
- sem_unlink - 移除名字非NULL的semaphore;如果该semaphore所有的sem_open都已经执行过sem_close,则销毁它
- sem_wait - 申请semaphore,如无效,则阻塞
- sem_trywait - 申请semaphore,如无效,则返回
- sem_timedwait - 申请semaphore,如无效,则阻塞到pTimeout指向的时刻
sem_post - 释放semaphore。如果没有task阻塞,则value加一,否则将优先级最高的一个task置为Ready
有没有发现这个semaphore与VxWorks的计数信号量非常非常相似,对比一下,如下图
其实semaphore就是用计数信号量封装的,因此需要移植VxWorks下的代码到其它OS时,替换相应API即可。而且,将semaphore声明为public object后,也可以用它实现进程间通信
VxWorks还提供了二进制信号量,更适用于多数情况的同步