生產者消費者問題 設信號量mutex1, mutex2, full1, full2, empty1, empty2分別表示1和2號緩沖區的訪問互斥, 是否滿, 是否空
semaphore mutex1 = 1, empty1 = n, full1 = 0; semaphore mutex2 = 1, empty2 = m, full2 = 0; void A()//向緩沖池1添加商品 { while(1) { produce next product1; p(empty1);//檢測當前緩沖池是否為空,如果為空(說明我A需要向里面放東西了),則進行下一步,否則,阻塞本進程 p(mutex1);//檢測是否可以進入緩沖區(即檢測緩沖區中是否有其他進程),若可以則自己進去並鎖上門,否則,阻塞本進程 buffer1(i) = product1;//將商品放入緩沖區1 i = (i + 1) % n;//緩沖隊列的尾指針后移 v(mutex1);//放完商品,離開緩沖區,釋放互斥訪問鎖,允許其他進程進入 v(full1);//通知進程B,我已放好商品,你可以來取了 } } void B()//從緩沖區1中取出商品,放到緩沖區2 { while(1) { p(full1);// 先檢測緩沖區1內是否有貨 p(mutex1);// 有貨,再檢測緩沖區1是否有其他進程正在訪問,沒有的話,自己進去並鎖上門 goods = buffer1(j);//取貨 j = (j + 1) % n; //緩沖隊列隊首指針后移 v(mutex1);// 取完貨后,釋放緩沖區1的互斥訪問鎖 v(empty1);// 提示A我取出貨了,你可以接着往里面放了 Consume goods and Produce next product2; p(empty2);// 檢測緩沖區2是否為空 p(mutex2);// 檢測當前緩沖區中是否有其他進程 buffer2(a) = product2;// 向2號緩沖區放置商品 a = (a + 1) % m;// 2號緩沖區緩沖隊列隊尾指針后移 v(mutex2);// 離開緩沖區2,釋放鎖 v(full2);// 通知C進程可以來取貨了(我已經放進去商品了,你可以來取了) } } void C() { while(1) { p(full2);// 檢測2號緩沖區內是否有貨 p(mutex2);//若有貨,加鎖,進入 goods = buffer2(b);//取出商品 b = (b + 1) % m;//2號緩沖區隊首指針后移 v(mutex2);// 離開緩沖區2,釋放鎖 v(empty2);// 通知B進程,我已經取出商品,你可以繼續往里面放了 Consume product; } } int main() { parbegin(A(), B(), C());//A,B,C三個進程並發執行 }