posix信号量分为命名信号量和基于内存的信号量
posix命名信号量,使用posix名字表示,可用于线程或进程间同步
1.sem_open
函数头文件: #include <semaphore.h>
函数原型:sem_t *sem_open(const char *name, int oflag, ... /* mode_t mode, unsigned int value */ );
函数功能:创建一个新的有名信号量或打开一个已存在的有名信号量 返回值:若成功则返回指向信号量的指针,该指针用作sem_close(),sem_wait(),sem_trywait(),sem_post(),sem_getvalue()的参数,若出错则返回SEM_FAILED
参数说明:name为路径名;oflag可以是0,O_CREAT,O_CREAT|O_EXCL; mode是可选参数,在O_CREAT有效; value可选,用于指定信号量的初值,范围为0-SEM_VALUE_MAX ,二值信号量的初始值通常为1,计数信号量初始值通常大于1
2.sem_close
int sem_close(sem_t* sem)
功能:关闭由sem_open()打开的有名信号量
返回值:成功返回0,失败返回-1
3.sem_unlink
int sem_unlink(const char* name)
功能:从系统中真正删除信号量
返回值:成功返回0,失败返回-1
POSIX基于内存信号量:存放在共享内存去中,可用于进程或线程间同步,代码中一般使用的是这种方式
1.sem_init
int sem_init(sem_t* sem, int shared, unsigned int value)
功能:初始化共享内存的无名信号量
返回值:出错返回-1
参数:sem是信号量的指针; shared为0是共享线程,为1是进程共享; value为信号量初始值
2.sem_destory
int sem_destory(sem_t * sem)
功能:销毁sem_init()初始化的无名信号量
返回值:成功返回0,出错返回-1
信号量的PV操作函数
sem_wait表示获取信号量,信号值大于0时,会使信号值减1,信号值等于0时,sem_wait会阻塞,使调用的进程或者线程进入休眠。sem_post释放信号量,会使信号值加1
3. int sem_wait(sem_t* sem)
功能:测试指定信号量的值,如果该值大于0,会使信号值减1并立即返回,如果该值等于0,则调用的进程或者线程阻塞进入修满,直到该值大于0,此时会再减1,函数随后返回。
4. int sem_post(sem_t* sem)
功能:把所指定的信号量加1,然后唤醒正在等待该信号量变为正数的任意进程或线程
返回值:成功返回0,出错返回-1
5. int sem_getvalue(sem_t* sem, int* val)
函数功能:获取当前信号量的值,通过val输出参数返回,如果当前信号量已经上锁(即同步对象不可用),那么返回值为0,或为负数,其绝对值就是等待该信号量解锁的线程数。
返回值:若成功则返回0,出错则返回-1
总结:
1.信号量的本质是一个数字,通过初始值,PV两种操作来判断信号量的值是否为0,为0会导致调用sem_wait()的进程阻塞(进程阻塞就是进程中某个函数阻塞了)
2.代码中添加信号量不改变原有的任何代码逻辑的,只是通过sem_wait是否会阻塞来改变多进程或多进程的执行顺序,在信号量为0时,sem_wait会阻塞,直到其他进程或者线程释放信号量,sem_wait才会返回继续执行代码。