linux系统编程--信号量

1信号量概念(高级互斥锁)

1.1分类

根据共享资源的数目可分为二值信号量和计数信号量两类。

分类 取值 举例
二值信号量 0和1 指示锁
计数信号量 0和n 停车场电子牌
分类 特点
命名信号量 基于文件
匿名信号量 基于内存

1.2作用

控制多进程/多线程共享资源的访问(资源有限并且不共享)

1.3本质

任一时刻只能有一个进程/线程访问临界区(代码),数据更新的代码。

1.4基本操作:PV

取值
P(信号量) 0:挂起进程;>0:减1
V(信号量) 0:恢复进程;>0:加1

1.5 POSIX 信号量

  • 资料:unpv22e-ch10.1~10.13
  • 查看:man sem_overview

1.1 接口

  • 头文件:semaphore.h
  • 库:pthread

2匿名信号量

2.1信号类型

  • sem_t sem;

2.2主要函数

2.1.1初始化 int sem_init (sem_t *sem , int pshared, unsigned int value)

  • 参数
    • pshared:0->线程同步 1->进程同步
    • value信号量的值:表示最多几个进程或现场操作共享数据
  • 返回值
    • -1 出错
    • 0 成功

2.1.2销毁 int sem_destroy(sem_t *sem)

  • 返回值
    • -1 出错
    • 0 成功

2.1.3挂出(解锁) int sem_post(sem_t *sem)

  • 调用一次sem_post相当于对sem做++操作

2.1.4等待(加锁) int sem_wait(sem_t *sem)

  • 调用一次sem_wait相当于对sem做–操作
  • 如果sem==0,加锁失败,不阻塞,直接返回

2.1.5尝试等待(尝试加锁) int sem_trywait(sem_t *sem)

  • 返回值
    • 错误号 出错
    • 0 成功

2.1.6获取信号量的值 int sem_getvalue(sem_t *sem, int *sval)

2.3s示例

  • 思路
    在这里插入图片描述

  • 代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值