写线程 ---写资源
可以写数据 的条件
1.开始时 ,buf空的
2.读线程 读完了
读线程
//buf充当读资源
//1.一开始,buf中没有数据可读的
1.写线程结束
信号量的机制
1.信号量
----来描述 可使用的资源的个数
2.p操作
表示 使用这个资源 资源个数减一
p操作逻辑
尝试获取资源
有资源可用,直接使用,资源个数减一
没有资源可用,此时等待
3.v操作
表示 产生这个资源,资源个数加1
Value:需要初始化多少个这样的资源
Pshared:用来指定这个信号量是用在进程还是线程中的(0 :线程 不为0:进程)
用多线程程序设计一个火车票售票系统,
要求:
1.至少有两个售票窗口,每个售票窗口
//2.不能重复买票,将100张车票均匀的从两个窗口卖出即可。 //锁
int couter=100:
//同步的效果:---信号量
./a.out
窗口1 卖出车票 1
窗口2 卖出车票 2
窗口1 卖出车票 3
窗口2 卖出车票 4
利用信号量的特点,使线程的执行之间有序
死锁现象:
总结:
共享进程资源方便
线程 抢占公共资源 带来的问题
互斥访问
需要互斥锁 来保障 原子性操作
使 操作完整
互斥锁:
A.初始化 锁
B.加锁 //使用资源之后
C.解锁 //用完之后
D.销毁 锁
有顺序的进行方向
信号量机制
资源的种类 资源的数量 如何抽象?
站在使用者的角度考虑
核心操作:
P ---操作申请资源
V ---操作释放资源
进程间的通信
进程创建好之后,父子进程的空间 相互独立
通信的方式
//同一主机
1、古老的通信方式
管道: //可以发好多话
无名管道 (1)
有名管道 (2)
信号 // 一次只能发一个 (3)
2、IPC对象通信 system v BSD suse fedora kernel.org
消息队列(用的相对少,这里不讨论) (4)
共享内存(*) //最高效 (5)
信号量集() //信号量 (6)
//不同主机
3、socket通信
网络通信 (7)
无名管道:
单向通道,用于进程间通信
数组管道的两端就是读写,数组的0号指针是读端,数组的1号指针是写端
int pipe(int pipefd[2]);
功能:
创建一个管道
参数:
pipefd //用来获取 管道的两端 //读端pipefd[0]
//写端pipefd[1]
返回值:
成功: 0
失败: -1 && errno
管道的特点:
1.管道大小 65536字节 64K
2.管道操作特点
数据读走之后,认为就没了
//写端存在,读端存在
管道如果为空,此时可以一直写,直到写满
//写端存在,读端不存在
此时可以写,但是写操作会使管道破裂,
会受到一个SIGPIPE的信号,该信号会使程序结束
//写端存在,读管道
可以读管道,但是管道中如果没有数据了,此时 读操作 阻塞
//写端不存在,读管道
可以读管道,但是管道中如果没有数据了,此时 读操作 不阻塞