为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第6天 C气象数据中心 第二章 2-11节,2-12节 linux信号量

标签:
C C++

课程名称:C/C++气象数据中心实战,手把手教你做工业级项目


课程章节:2.10 linux共享内存


主讲老师: 吴从周



课程内容:

  1. 描述并理解信号量的概念和原理。

  2. 采用测试程序对信号量的操作函数进行讲解

  3. 加深信号量在实际运用中的使用技巧。





课程收获:

  1. 信号量本身实质是一个非负数的计数器,我们使用其给共享资源建立标志,表示共享资源的占用情况,当共享资源被占用时,我们通过信号量反馈给此时此刻也需要调用此共享资源的程序,禁止其在此时调用共享资源。当共享资源调用结束时,我们通过改变信号量的值,表示此时开始可以进行对共享资源的访问。

    每个执行程序在进入临界区之前都应该先申请信号量,申请成功就有了操作特点的临界资源的权限,当操作完毕后就应该释放信号量。


  2. 信号量的PV操作,

    P操作:我们将申请信号量称为P操作,申请信号量的本质就是申请获得共享资源的使用权限,当申请成功时资源的数目应该减一,因此P操作的本质就是让计数器减一。

    V操作:我们将释放信号量称为V操作,释放信号量的本质就是直接归还共享资源的使用权限,当释放成功共享资源的数目就应该加一,因此V操作的本质就是让计数器加一。

    例如网吧的机子数量,这个数量是有限的,当一个人进行开机之后,机子数量就会减1,类似于P操作,下机之后,机子数量就会+1,类似于V操作。当共享空间需要只能同时被一个程序访问修改时,机子的数量就是1。

    注意:PV操作是原子操作,因为PV操作的本质上也应该是共享资源,不能重复对PV操作使用信号量机制

  3. 信号量的函数

     常用的就是初始化信号量函数,int sem_init(sem_t *sem, int pshared, unsigned int value);

    sem:需要初始化的信号量。semget函数用于创建或者获取信号量,返回值是信号量的标志码,和共享内存的操作函数十分类似。

    pshared:传入0值表示线程间共享,传入非零值表示进程间共享。

    value:信号量的初始值(计数器的初始值)。

    一般后两个参数都可以是缺省值,初始化信号量成功返回0,失败返回-1。

  4. semctl函数,sem_op函数

int semctl(int semid, int semnum, int cmd, ...);

    采用此函数可以对信号量进行高级操作,在生产实际中主要用于设置信号量的初始值。sem_op函数用于PV操作,信号量的值无法直接进行加减运算,需要通过op函数进行,PV操作中所运用的函数实际上是一样的,只是赋值不同。

https://img1.sycdn.imooc.com/62f0fd7300018e7e16370421.jpg




https://img4.sycdn.imooc.com/62f0fd80000191fd10340740.jpg








https://img1.sycdn.imooc.com/62f0ce080001775317310925.jpg

https://img2.sycdn.imooc.com/62f0f384000192db16920881.jpg

https://img1.sycdn.imooc.com/62f0fd9e0001d84c09550294.jpg


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消