Linux编程-信号量
本文最后更新于:1 年前
POSIX 标准中,信号量用 sem_t 类型的变量表示,该类型定义在<semaphore.h>头文件中
多线程程序中,使用信号量需遵守以下几条规则:
信号量的值不能小于 0;
有线程访问资源时,信号量执行“减 1”操作,访问完成后再执行“加 1”操作;
当信号量的值为 0 时,想访问资源的线程必须等待,直至信号量的值大于 0,等待的线程才能开始访问。
定义信号量
#include <semaphore.h>
sem_t mySem;
初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
- sem:表示要初始化的目标信号量;
- pshared:表示该信号量是否可以和其他进程共享,pshared 值为 0 时表示不共享,值为 1 时表示共享;
- value:设置信号量的初始值。
操作信号量
int sem_post(sem_t* sem);
int sem_wait(sem_t* sem);
int sem_trywait(sem_t* sem);
int sem_destroy(sem_t* sem);
参数 sem 都表示要操作的目标信号量。各个函数的功能如下:
- sem_post() 函数的功能是:将信号量的值“加 1”,同时唤醒其它等待访问资源的线程;
- 当信号量的值大于 0 时,sem_wait() 函数会对信号量做“减 1”操作;当信号量的值为 0 时,sem_wait() 函数会阻塞当前线程,直至有线程执行 sem_post() 函数(使信号量的值大于 0),暂停的线程才会继续执行;
- sem_trywait() 函数的功能和 sem_wait() 函数类似,唯一的不同在于,当信号量的值为 0 时,sem_trywait() 函数并不会阻塞当前线程,而是立即返回 -1;
- sem_destory() 函数用于手动销毁信号量。
以上函数执行成功时,返回值均为 0 ;如果执行失败,返回值均为 -1。