一、信息量
1.信息量:线程间有序的进行工作
2.资源个数:描述可使用资源的个数
3.操作:p操作:使用这个资源,表示资源个数减1
v操作:产实这个资源,表示资源个数加1
p操作逻辑:尝试获取资源,有资源可用直接使用,资源减1,如果没1,继续等待
v操作逻辑:释放一个资源,如果此时有任务在等待资源直接使用
4.信号量定义:sem_t sem 创造一类资源
初始化:sem_init(sem_t *sem,int pshared, unsigned int value);
功能:将已经定义好的信号量赋值
参数:sem 要初始化的信号量
pshared = 0 表示线程间使用信号量
!=0 表示进程间使用信号量
value 信号量的初始值,一般无名信号量 0或1
成功返回0 失败返回-1
5.信号量的pv操作:
sem wait()判断当前信号量是否有资源可用 / sem post()释放资源
参数均为要操作的信号量 成功返回0 失败返回-1
6.信号量销毁:sem_destroy() 参数:&sem
7.总结:共享进程资源方便 线程抢占公共资源带来的问题
1.互斥访问:需要互斥锁,来保障原子性操作
2.有顺序的进行访问:信号量机制,核心操作:pv
二、进程间的通信
进程创建之后。父子进程的空间相互独立
1. 古老通信方式: 管道: 无名管道 有名管道
信号
2.ipc对象通信:消息队列 共享内存 信号量集
3.socket通信 网络通信,用于不同主机间
4.无名管道: pipe(int pipe fd[2]) 创建一个无名管道
参数:pipe fd 用来获取管道两端 读端:fd[0] 写端:fd[1]
成功返回0 失败错误码
5.管道特点: 最大64k.65536个字节
数据读完后就会消失
写端存在,读端也存在:管道若为空,则一直写直到写满
写端存在,读端不存在:导致管道破裂,收到信号SIGPIPE,使程序结束
写端存在,读管道:可以读,如果没有数据,此时读操作阻塞
写端不存在,读管道:可以读,如果没有数据,读操作不阻塞