题26
题目
【2022 统考真题】某进程的两个线程 T1 和 T2 并发执行 A、B、C、D、E 和 F 共 6 个操作, 其中 T1 执行 A、E 和 F, T2 执行 B、C 和 D。下图表示上述 6 个操作的执行顺序所必须满足的约束:C在A和B完成后执行, D和E在C完成后执行, F在E完成后执行。
请使用信号量的 wait()、signal() 操作描述 T1 和 T2 之间的同步关系, 并说明所用信号量的作用及其初值。

分析
这个是典型的用信号量实现前驱的问题,C操作之前要把A和B释放出来,D操作要把C操作释放出来,E操作也要把C操作释放出来,F要把E释放出来,D和E之间是否有必要维护一个互斥锁,让两者不要竞争C?
这个题目的特色是强制要求了用wait和signal操作来实现,要在这里学一下pv操作和wait和signal的转换
如何用signal这种写法,A完成了自己的时候就要通知依赖于它的C进程,开局有两支,两支又合成了一支,所以只写两个函数,一个路线去ACEF做F,一个路线ABCD去最后做D,这里和题24对比一下看
解
这种前驱题要通过AOV网画出拓扑排序的图,来确定信号量设置多少
semaphore S_AC = 0; //控制操作A和C的执行顺序
semaphore S_BC = 0; //控制操作B和C的执行顺序
semaphore S_CD = 0; //控制操作C和D的执行顺序
semaphore S_CE = 0; //控制操作C和E的执行顺序
semaphore S_EF = 0; //控制操作E和F的执行顺序
cobegin
Process T1() {
// process A
完成操作A;
signal(S_AC); // V(S_AC);
// process E
wait(S_CE); // P(S_CE);
完成操作E;
signal(S_EF); // V(S_EF);
// process F
wait(S_EF); // P(S_EF);
完成操作F;
}
Process T2() {
// process B
完成操作B;
signal(S_BC); // V(S_BC);
// process C
wait(S_AC); // P(S_AC);
wait(S_BC); // P(S_BC);
完成操作C;
signal(S_CD); // V(S_CD);
signal(S_CE); // V(S_CE);
// process D
wait(S_CD); // P(S_CD);
完成操作D;
}
coend