
回顾:
确定临界区
即确定哪段代码用于访问临界资源
设置 互斥信号量 mutex, 并初始化
进入区进行P(mutex)操作以申请资源
回顾进程互斥的四个逻辑部分

退出区进行V(mutex)操作以释放资源

英文翻译:
mutex: 互斥体
semaphore: 信号量
使用semaphore mutex方式定义信号量一般认为是记录型信号量
typedef struct {
int value;
struct process *L;
}semaphore;
考虑P操作中资源数为0时的情况

先对value–, 然后发现value<0, 该进程阻塞
所以我们可以利用如上特性, 阻止代码的执行
确定需要进行进程同步的地方,
即哪部分要在前面执行,
哪部分要在后面执行
设置同步信号量S, S.value初始化为0
添加PV操作
先执行的代码的末尾添加V(S)操作
后执行的代码的开头添加P(S)操作
semaphore S = 0;
P1 ( ) {
代码1;
代码2;
V(S);
代码3;
}
P2 ( ) {
P(S);
代码4;
代码5;
代码6;
}
如上代码中, 代码1,2必然在代码4,5前执行
在没有执行V(S)之前, S=0, 直接执行P(S)
会阻塞该进程
除非执行了V(S)使得S.value++后才能顺利执行P(S)以后的内容
图中:

使用信号量实现进程同步与进程的前驱关系时, 特别要注意总结出来的结论: