一、什么是信号量
信号量的作用主要是用于进程间信息的同步和互斥,保证临界区的数据的访问顺序不被打乱,信号量主要的目的并不是传数据,而是保护临界区数据在访问时的完整性。信号量本质上就是一个非负的正整数计数器,对信号量可以执行P(获取),V(释放)的操作,当信号量值大于0的时候,执行P操作的时候就能获取到信号量,每获取到一次信号量的时候就对会对计数器减1操作。当信号量的值等于0的时候,P(获取)信号量的操作就会阻塞,无法获取信号量,不能访问临界区数据,直到有进程执行的V(释放)操作才行,释放信号量其实就是将信号量的值加1。总之P操作就是对信号量值减1,V操作就是对信号量值加1,当信号量值等于0的时候P操作被阻塞。当我们控制信号量的值不大于1的时候,这时候的信号量称之为二值信号量(0/1信号量),可以用作互斥操作,和mutex互斥锁的效果一样。
二、信号量的类型
Linux系统为我们提供了两种信号量:内核信号量和应用用户态信号量。用户态信号量又分为两种: POSIX信号量 和 SYSTEM V信号量。其中POSIX信号量还有命名信号量和无名信号量的区分。命名信号量-信号值保存在文件中,可以用作在进程和线程间同步。无名信号量-信号值保存在内存中,只能用作线程间同步。SYSTEM V信号量可以在不同的独立进程间进行通信。
三、SYSTEM V 信号量介绍
这是一个信号量的集合,不是单个信号量,要包含以下头文件 <sys/ipc.h> 和 <sys/sem.h>,一般我们使用的就是单个信号量,所以在使用的过程中,信号量索引一定是传0。
API介绍: