前言
本文仅用于个人学习信号量函数,涉及到的内容也是从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);