一、信号量semaphore
1.1概念
也称信号灯,信号量本质上是一个计数器(非负整数),主要用来保护临界资源(共享资源),这种资源同一时刻仅供一个进程(线程)使用,它的值表示系统中该资源的数量(若为0当然不允许使用),因此可以实现进程(线程)间的同步与互斥。对于共享内存,所有进程都可以访问,就容易导致读写冲突,此时就很需要信号量来配合使用。
同步指在共享它的进程或线程间保持数据一致
互斥指同一时刻仅供一个进程(线程)使用资源
信号量只能通过三种操作来访问:
-
初始化
-
P操作(申请使用资源,属于"消费者")
-
如果信号量>0,信号量-1返回;
-
如果信号量==0,则睡眠等待直到信号量>0然后立即-1返回
-
-
V操作(释放资源,属于"生产者")
-
无进程/线程等待时+1,
-
有进程/线程等待资源时(说明信号量为0)则唤醒并让其返回
-
linux用户态进程提供三种信号量,POSIX有名信号量、POSIX无名信号量、SYSTEM V信号量。
有名信号量的值保存在文件中(具体是保存在/dev/shm/目录下,使用时需要链接库),它既可以用于进程(包括不相关进程)也可以用于线程;
无名信号量的值保存在内存中,Linux只支持线程同步。
除了创建和删除不同,PV操作对应的API都相同
1.2创建
#include <semaphore.h>
#include <pthread.h>
//创建有名信号量
sem_t *sem_open(char *name, int oflag, mode_t mode, unsigned int value)
@param: name 信号量文件名字,不要带路径,因为有默认存放的目录
oflag 常用O_CREAT
mode 常用0666
value 信号量初始值(二值信号量为1,普通信号量表示资源数目)
@return: 成功返回信号量指针,失败返回SEM_FAILED with errno值