2 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊
這里提供一種使用信號量實現(xiàn)的同步互斥算法,實現(xiàn)上述要求:
// 初始化三個信號量
semaphore sem1 = 0;
semaphore sem2 = 0;
semaphore sem3 = 0;
// 進(jìn)程 P1
P(sem1); // P1 等待 sem1 信號量
// 執(zhí)行 P1 的操作
V(sem2); // 發(fā)送 sem2 信號量,使 P2 可以開始執(zhí)行
// 進(jìn)程 P2
P(sem2); // P2 等待 sem2 信號量
// 執(zhí)行 P2 的操作
V(sem3); // 發(fā)送 sem3 信號量,使 P3 可以開始執(zhí)行
// 進(jìn)程 P3
P(sem3); // P3 等待 sem3 信號量
// 執(zhí)行 P3 的操作
V(sem4); // 發(fā)送 sem4 信號量,使 P4 可以開始執(zhí)行
// 進(jìn)程 P4
P(sem2); // P4 等待 sem2 信號量
P(sem3); // P4 等待 sem3 信號量
// 執(zhí)行 P4 的操作
// 初始化信號量
sem1 = 1;
sem2 = 0;
sem3 = 0;
sem4 = 0;
上述算法中,P1、P2、P3、P4 四個進(jìn)程依次執(zhí)行,且滿足P1必須在P2、P3開始前完成,P2、P3必須在P4開始前完成,且P2和P3不能并發(fā)執(zhí)行的要求。具體實現(xiàn)中,通過使用信號量來協(xié)調(diào)進(jìn)程之間的同步和互斥操作。其中,sem1 信號量的初始值為0,表示P1必須等待其他進(jìn)程完成后才能執(zhí)行;sem2 和 sem3 信號量的初始值均為0,表示P2和P3必須等待前面的進(jìn)程執(zhí)行完畢并發(fā)送信號量后才能執(zhí)行;sem4 信號量的初始值為0,表示P4必須等待P3完成后才能執(zhí)行。

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊
為了實現(xiàn)4個進(jìn)程P1、P2、P3、P4的同步互斥,可以使用條件變量和互斥量來實現(xiàn)。
1. 初始化一個全局的互斥量mutex,并初始化三個條件變量cond1, cond2, cond3。
2. P1開始時獲得mutex鎖,然后執(zhí)行自己的代碼;當(dāng)它執(zhí)行完畢時,將cond1信號量設(shè)置成true;最后釋放mutex鎖。
3. P2開始時會先檢測cond1是否為true;如果不是true則在cond1上wait()直到P1將其標(biāo)記成true; 如果是true則獲得mutex鎖并執(zhí)行自己的代碼;當(dāng)它執(zhí)行完畢時將cond2信號量標(biāo)記成true;最后釋放mutex鎖。
4. P3開始時檢測cond2是否為true;如果不是true則在cond2上wait()直到P2將其標(biāo)記成true;如果是 true 則 獲得 mutex 鎖并 執(zhí) 行 自 己 的 代 碼 ; 當(dāng) 它 執(zhí) 行 完 畢 時 ;將 cond3信號標(biāo)志位標(biāo)志位標(biāo)志位標(biāo)志位標(biāo)志位標(biāo)志位標(biāo)志位標(biāo)志位 成 true ; 最 后 釋 放 mutex 鎖 。
5. P4開始時檢測cond3是否為 true;如果不是 true ,則在 cond 3上 wait () 直 到 p 3將其標(biāo) 記成 true ;如 果 是 true,就 進(jìn)入 critical section ,然后執(zhí)行代碼邏輯 ; 最后 釋 放 mutex 鎖
添加回答
舉報