生產者消費者問題 設信號量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三個進程併發執行 }