前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSIX之semaphore

POSIX之semaphore

作者头像
Taishan3721
发布2022-05-16 14:42:05
7820
发布2022-05-16 14:42:05
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

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还提供了二进制信号量,更适用于多数情况的同步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档