一、信号量的概念
信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。
信号量是一个结构体,信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。
二、信号量的分类
linux下的信号量有很多种,首先分为 内核信号量 和 用户态信号量。
内核信号量 :由内核控制路径使用。
用户态信号量:用户态信号量又分为 posix信号量 和system V信号量。
(system V比较复杂,头文件为#include <sys/sem.h>;
posix信号量比较简单,#include <semaphore.h>)
然后posix信号量又分为有名信号量和无名信号量。
有名信号量:其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。
无名信号量:其值保存在内存中。Linux 只实现了无名信号量。
三、POSIX信号量
1.无名信号量
无名信号量的创建就像声明一般的变量一样简单,例如:
sem_t sem_id;
然后再初始化该无名信号量,之后就可以放心使用了。
无名信号量常用于多线程间的同步,同时也用于相关进程间的同步。也就是说,无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量,这两个条件是缺一不可的。
首先介绍一个结构体,sem_t,它在semaphore.h中是这样定义的:
typedef struct sem_t_ * sem_t;
struct sem_t_
{
int value;
pthread_mutex_t lock;
HANDLE sem;
#if defined(NEED_SEM)
int leftToUnblock;
#endif
};
2、 无名信号相关的函数
1〉 sem_init信号量初始化函数
函数原型:
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unisigned int value);
参数意义:
创建一个信号灯sem,初始化其值为value。
pshared决定了信号量可以在几个进程之间共享。pshared==0 用于同一多线程的同步;
若pshared>0 用于多个相关进程间的同步(即