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.