信号量函数的学习

前言

本文仅用于个人学习信号量函数,涉及到的内容也是从CSDN别的大佬那里学来的嘿嘿!

一、信号量是什么?

首先我们要知道什么是信号量,什么时候要用到信号量?
信号量主要是用来保护共享资源的,如果你想限制某个资源在同一时刻只能有一个(或多个)线程拥有,就可以使用信号量。

二、信号量函数

一组POSIX标准下的无名函数:
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem);

1.使用实例

上述的一组信号量函数怎么使用呢?
  举一个例子,比如你和你的同学同时去打印店打印期末复习材料,但是打印机只有一台,有两台电脑可以操作这台打印机,也就是说有两个线程都要往打印机上打东西,但是同一时刻只能打一个。那么信号量在里面充当什么样的角色呢?
  首先使用sem_init()初始化一个信号量,助理函数参数pshared表示允许几个进程共享该信号量,一般设置为0用于进程内多线程共享,这要看是否支持进程共享,请查看系统的man手册(并未查看,有点不理解)。
  第三个参数value表示可用的资源数目,咱们这儿只有1个打印机,value=1。
  然后,线程调用sem_wait()函数获取这个资源,第一个线程一看,有一个,他就拿到了这个资源,然后可以继续后续操作,此时资源数自动减1,变为0个。那么第二个线程调用sem_wait()函数就会阻塞。
  第一个线程完成打印工作后,调用sem_post()释放资源,资源数目变成1,将会话习惯等待的第二个线程,然后第二个线程接着打印。
  最后当所有的任务完成后,主线程覅用sem_destroy()函数释放信号量。
  所以在这个过程中,多次用到的只有四个函数:
  sem_init(),sem_wait(),sem_post(),sem_destoy().
  另外的sem_trywait()主要是测试一下有没有可用资源,sem_getvalue()读取当前资源的个数。

int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值