(一)概念
信号量是一个整数,这个整数允许多进程或多线程同步他们的操作。这个整数必须大于等于0.
linux库函数中,类似有名映射、匿名映射,有名管道、无名管道,信号量也有有名信号量和匿名信号量。匿名信号量在内存中,不在文件系统中,一般用于线程之间的同步;有名信号量需要创建文件,一般用于进程之间的同步。有名信号量见:有名信号量
(二)匿名信号量库函数
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化一个匿名信号量
参数:
sem 指定了要初始化的信号量的地址
pshared 0 多线程 非0 多进程
value 指定了信号量的初始值
返回值:
成功 0
错误 -1 errno被设置
#include <semaphore.h>
int sem_destroy(sem_t *sem);
功能:销毁一个匿名信号量
参数:
sem 指定要销毁的匿名信号量的地址
返回值:
成功 0
错误 -1 errno被设置
#include <semaphore.h>
int sem_post(sem_t *sem);
功能:信号量的值加1操作.如果因此变为大于0.等待信号量的值变为大于0的进程或线程被唤醒,继续对信号量的值减一.
参数:
sem 指定具体的信号量
返回值:
成功 0
错误 -1 errno被设置 信号量的值不变
#include <semaphore.h>
int sem_wait(sem_t *sem);
功能:减一操作 如果当前信号的值大于0,继续立即返回.
如果当前信号量的值等于0.阻塞,直到信号量的值变为大于0.
参数:
sem 指定具体的信号量
返回值:
成功 0
错误 -1 errno被设置 信号量的值不变
int sem_trywait(sem_t *sem);
功能:尝试wait,不阻塞
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
功能:带时间的wait
参考博客:https://blog.csdn.net/u013511885/article/details/103116998?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-3-103116998.pc_agg_new_rank&utm_term=c%E8%AF%AD%E8%A8%80%E4%BF%A1%E5%8F%B7%E9%87%8F%E6%9C%BA%E5%88%B6&spm=1000.2123.3001.4430