這次介紹的幾個IPC(Inter-process Communication)進程間的通訊問題,加上上篇博客介紹的生產者-消費者問題及其變形,都是非常經典的IPC問題,在王道老師講解的時候,彈幕一片“秒啊”、“666”,這幾個問題的解決方案也着實讓人着迷,當我帶着懷疑去驗證時候,又有一種豁然開朗的感覺,這些都是單一進程問題所不曾有過的。
一、問題描述
二、問題分析
該問題本質上是“可生產多種產品的單生產者—多消費者”問題。
三、如何實現
是否需要設置一個專門的互斥信號量呢?
並不需要,本題中的緩沖區大小為1,在任何時刻四個同步信號量中最多只有一個是1,在任何時刻只有一個進程的P操作不會被阻塞,並順利地進入臨界區!
semaphore offer1 = 0; semaphore offer2 = 0; semaphore offer3 = 0; semaphore finish = 0; int i = 0; provider(){ while(1){ if(i == 0){ 將組合一放桌上 V(offer1); }else if(i == 1) { 將組合二放桌上 V(offer2); }else id(i == 2) { 將組合三放桌上 V(offer3); } i = (i+1)%3; P(finish); } } smoker1 (){ while(1){ P(offer1) 從桌上拿走組合一; 卷煙; 抽掉; V(finish); } } smoker2 (){ while(1){ P(offer2) 從桌上拿走組合二; 卷煙; 抽掉; V(finish); } } smoker3 (){ while(1){ P(offer3) 從桌上拿走組合三; 卷煙; 抽掉; V(finish); } }
四、總結
吸煙者問題的精華是如何實現“輪流讓各個吸煙者吸煙”,這里我們的解決方案是使用一個整形變量i來實現這個“輪流”過程的。