五、Linux系统编程:信号量

5 信号量

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。

  • 背景
    数据竞争
  • 作用:
    控制多进程共享资源的访问(资源有限并且不共享)
  • 本质
    任一时刻只能有一个进程访问临界区(代码),数据更新的代码。
  • 基本操作:PV
    原子操作操作也被成为PV原语(P来源于Dutchproberen"测试",V来源于Dutchverhogen"增加")
    在这里插入图片描述
  • 信号
分类 取值
P(信号量) 0:挂起进程;>0:减1
V(信号量) 0:恢复进程;>0:加1
  • POSIX信号量
    查看:man sem_overview

5.1 接口

  • 头文件:semaphore.h
  • 库:pthread
  • 分类
    信号量分为命名信号量(基于文件)与匿名信号量(基于内存)两种。

5.2 命名信号量/基于文件

操作 函数
创建 sem_t *sem_open(const char *name, int oflag, mode_t mode,unsigned int value)
删除 int sem_unlink(const char *name)
打开 sem_t *sem_open(const char *name, int oflag)
关闭 int sem_close(sem_t *sem)
挂出 int sem_post(sem_t *sem)
等待 int sem_wait(sem_t *sem)
尝试等待 int sem_trywait(sem_t *sem)
获取信号量的值 int sem_getvalue(sem_t *sem, int *sval)

5.2.1创建

sem_t *sem_open(const char *name, int oflag, mode_t mode,unsigned int value)
  • 参数
参数 含义
name 信号量IPC名字
oflag 标志
mode 权限位
value 信号量初始值
  • 返回值
返回值 含义
SEM_FAILED 信号量的指针
SEM_FAILED 出错

5.2.2 删除

int sem_unlink(const char *name)
  • 参数:
    name: 信号量IPC名字

  • 返回值

返回值 含义
-1 出错
0 成功

5.2.3 打开

sem_t *sem_open(const char *name, int oflag)
  • 参数:
参数 含义
name 信号量IPC名字
oflag 标志
  • 返回值
返回值 含义
SEM_FAILED 信号量的指针
SEM_FAILED 出错

5.2.4 关闭

int sem_close(sem_t *sem)
  • 参数:
    sem:信号量的指针

  • 返回值

返回值 含义
-1 出错
0 成功

5.2.5 挂出

int sem_post(sem_t *sem)
  • 参数:
    sem:信号量的指针

  • 返回值

返回值 含义
-1 出错
0 成功

5.2.6 等待

int sem_wait(sem_t *sem)
  • 参数:
    sem:信号量的指针

  • 返回值

返回值 含义
-1 出错
0 成功

5.2.7 尝试等待

int sem_trywait(sem_t *sem)
  • 参数:
    sem:信号量的指针

  • 返回值

返回值 含义
-1 出错
0 成功

5.2.8 获取信号量的值

int sem_getvalue(sem_t *sem, int *sval)
  • 参数:
参数 含义
sem 信号量的指针
sval 信号量的值
  • 返回值
返回值 含义
-1 出错
0 成功

5.3 匿名信号量/基于内存

操作 函数
初始化 int sem_init (sem_t *sem , int pshared, unsigned int value)
销毁 int sem_destroy(sem_t *sem)
挂出 int sem_post(sem_t *sem)
等待 int sem_wait(sem_t *sem)
尝试等待 int sem_trywait(sem_t *sem)
获取信号量的值 int sem_getvalue(sem_t *sem, int *sval)

注:其中挂出等待操作与命名信号量相同。

5.3.1 初始化

int sem_init (sem_t *sem , int pshared, unsigned int value)
  • 参数
参数 含义
sem 信号量的指针
pshared 共享方式。0:线程间共享;1:进程间共享,需要共享内存
value 信号量初始值
  • 返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值