一、信号量
信号量是一种用于提供不同进程间或一个从给定进程的不同线程间同步手段的原语。
1.1、Posix信号量的选择
1)单个进程的各个线程共享,可以使用基于内存的信号量。
2)彼此无亲缘关系的不同进程需使用信号量时,通常使用有名信号量。
1.2、基于内存的信号量的持续性
1)如果某个基于内存的信号量是由单个进程的各个线程共享的(sem_init的shared的参数为0),那么该信号量具有随进程的持续性,当该进程终止时它也消失。
2)如果某个基于内存的信号量是在不同进程间共享的(sem_init的shared的参数为1),那么该信号量必须存放在共享内存区中,因而只要该共享内存区任然存在,该信号量也就继续存在。
二、信号量分类
三、特性
1)互斥锁必须总是由锁住它的线程解锁,信号量的挂出却不必由执行过它的等待操作的同一线程执行。
2)信号量有一个与之关联的状态(计数值),信号量的挂出操作总是被记住。向一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么该信号将丢失(即如果某个线程调用pthread_cond_signal,不过当时没有任何线程阻塞在pthread_cond_wait调用中,那么发往相应条件变量的信号将丢失)。
3)当持有某个信号量锁的进程没有释放该锁就终止时,内核没有自动挂出该信号量。这与记录锁不一样,当持有某个记录锁的进程没有释放它就终止时,内核会自动释放。
四、Posix信号量函数
sem_open()函数 //创建一个新的有名信号量或打开一个已存在的有名信号量。
sem_close()函数
关闭由sem_open()打开的有名信号量。
sem_unlink()函数
从系统中删除有名信号量。
sem_wait()函数
等待信号量,如果该值大于0,那就将它减1并立即返回。如果该值等于0,调用线程就被投入睡眠,知道该值变为大于0,此时再将它减1,函数随后返回。
sem_trywait()函数
当所指定信号量为0时,不将调用线程投入睡眠。而是返回一个EAGAIN错误。
sem_post()函数
把所指定的信号量加1,然后唤醒正在等待该信号量变为正数的任意线程。
int sem_getvalue(sem_t *sem, int *sval);
参数 sem:等待的信号量。
参数 savl:保存所指定信号量的当前值。如果该信号量当前已上锁,那么返回或为0, 或为某个负数(其决定值就是等待该信号量解锁的线程数)
sem_init()函数
基于内存的信号量初始化。
sem_destroy()函数
摧毁基于内存的信号量。
五、System V信号量
函数说明
smeget()函数
创建一个信号量集或访问一个已存在的信号量集。
semop()函数
对信号量进行操作。