信号量
信号量的机制:
1.信号量 ----来描述 可使用的资源的个数
-
-
buf[1024] //公共资源 //buf2[1024] 写线程 ---写资源 可以写数据 的条件
-
1.开始时 ,buf空的 2.读线程 读完了 读线程 //buf充当读资源 //1.一开始,buf中没有数据可读的
-
1.写线程结束 信号量的机制: 1.信号量 --- 来描述 可使用的资源的个数
-
2.P操作 表示 使用这个资源 资源个数减 1 p操作逻辑 尝试获取资源, 有资源可用,直接使用,资源个数减一 如果没有资源可用,此时等待
-
3.V操作 表示 产生这个资源 资源个数加 1
-
总结:
共享进程资源 方便
线程 抢占公共资源 带来的问题
1.互斥访问
需要互斥锁来保证原子性操作 使操作过程完整
互斥锁:
a.初始化 锁 b.加锁 c.解锁 d.销毁锁
死锁问题解决方法:
1.对于线程的信号量死锁的处理,在线程结束时记得给另外一个在等待的信号量一个,结束信号的量,对于线程来说,信号量的逻辑优先级是最高的。
所以 1)逻辑上有循环的话,信号量的判断应该在循环内。2)需要结束进程时,已经结束的信号量需要进行操作,(主要在循环中)使其他在等待的信号量获得一个它已经结束的信息。
进程间的通信
进程创建好之后,父子进程之间相互独立
7种进程的通信:
管道:1)无名管道,管道空间是有限的。管道大小为 65536字节 64k 2)管道操作特点:数据读走之后,认为就没了,3)管道如果为空,此时可以一只写,直到写满
管道的创建 (!!!切忌,别创建在进程之后,也就是fork之后)
-
整个过程为 创建和判断的过程 pipe()这个过程为创建过程
-
无名管道的创建:理解成单通道,只创建在fork之前,创建在fork之后的单通道双向通信,要解决一个时序的问题,因为父进程和子进程是同时进行的,通过一个通道互发信息的话,当双方同时发信息时会发生冲突。
-