信号灯、互斥锁和条件变量之间的差异: 互斥锁必须由给他上锁的线程解锁,信号灯的挂出不必由执行过它的等待操作的同一线程执行 互斥锁要么被锁住要么被解开 既然信号灯有一个与之相关连的状态(它的计数值),信号灯挂出操作总是被记住。然而当想一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么该信号将丢失
1 sem_open、sem_close和sem_unlink函数
功能:创建并初始化信号灯,如果存在就返回存在的信号灯。
代码语言:javascript复制#include <semaphore.h>
sem_t * sem_open(const char * name,int oflag,mode_t mode,unsigned int value);
参数:name是给信号灯指定一个名字。oflag的值为O_CREAT,表示如果信号灯不存在,创建信号灯;为O_CREAT|O_EXCL,如果信号灯不存在报错。后面两个参数,只有新建信号灯时使用。mode为信号灯的权限(0644),value为信号灯的值。 返回值:成功时,返回信号灯的指针,错误返回SEM_FAILED
功能:关闭引用信号灯,信号灯引用计数减1。
代码语言:javascript复制#include <semaphore.h>
int sem_close(sem_t * sem)
参数:sem为信号灯的指针 返回值:成功时,返回0,失败,-1 注:每个信号灯有一个引用计数器记录当前打开次数.关闭一个信号灯并没有将它从系统中删除,而是信号灯引用计数减1
功能:信号灯引用计数为0时,从系统中删除信号灯。
代码语言:javascript复制#include <semaphore.h>
int sem_unlink(const char *name)
参数:name为信号灯的外部名字 返回值:成功时,返回0,失败,-1
2 sem_wait和sem_trywait函数
功能:等待共享资源,信号灯值为0就睡眠,信号灯值大于0,就使用共享资源,信号灯值减一。sem_trywait当信号灯值为0时,不睡眠,报错。
代码语言:javascript复制#include <semaphore.h>
int sem_wait(sem_t *sem)
int sem_trywait(sem_t *sem)
参数:sem为信号灯指针 返回值:成功时,返回0,失败,-1
3 sem_post和sem_getvalue函数
sem_getvalue函数 功能:获得信号灯的值
代码语言:javascript复制#include <semaphore.h>
int sem_getvalue(sem_t *sem,int *valp)
参数:sem为信号灯指针,valp为信号灯的值
返回值:成功时,返回0,失败,-1
sem_post函数 功能:使用完共享资源后,信号灯值加1,唤醒其他睡眠的。
代码语言:javascript复制#include <semaphore.h>
int sem_post(sem_t *sem)
参数:sem为信号灯指针 返回值:成功时,返回0,失败,-1
4 sem_init和sem_destroy函数
代码语言:javascript复制#include<semaphore.h>
int sem_init (sem_t *sem, int pshared, unsigned int value);
int sem_destroy (sem_t *sem);