Linux编程-信号量

本文最后更新于:1 年前

POSIX 标准中,信号量用 sem_t 类型的变量表示,该类型定义在<semaphore.h>头文件中

多线程程序中,使用信号量需遵守以下几条规则:

  1. 信号量的值不能小于 0;

  2. 有线程访问资源时,信号量执行“减 1”操作,访问完成后再执行“加 1”操作;

  3. 当信号量的值为 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。