操作系統上機作業--使用條件變量解決生產者、計算者、消費者問題(多線程)

pc1.c: 使用條件變量解決生產者、計算者、消費者問題

/*
?   系統中有3個線程:生產者、計算者、消費者
?   系統中有2個容量為4的緩沖區:buffer1、buffer2
?   生產者生產'a'、'b'、'c'、‘d'、'e'、'f'、'g'、'h'八個字符,放入到buffer1
?   計算者從buffer1取出字符,將小寫字符轉換為大寫字符,放入到buffer2
?   消費者從buffer2取出字符,將其打印到屏幕上

實現思路:設置兩個大小為4的緩沖區,第一個為生產者和計算著共享,第二個為計算者和消費者共享。

1、生產者線程產生字符,將字符寫入緩沖區buffer1中,并將指針后移,當緩沖區被寫滿是,將生產者線程掛起,喚醒計算者線程,等待緩沖區buffer1有空閑存儲空間的時候再喚醒生產者線程。

2、計算者線程從buffer1中讀取數據,并移動指針,并將讀取的數據寫入buffer2中,當buffer1有空閑時,喚醒生產者進程,當buffer2被寫滿時喚醒消費者進程。

3、消費者進程從buffer2中讀取字符并輸出,并移動指針,當buffer2有空閑的時候,喚醒計算者進程。
實現代碼:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>#define CAPACITY 4char buffer1[4];
char buffer2[4];int crea; //生產者 
int comp1;//計算者 
int comp2;//計算者 
int cons; //消費者 int buffer1_is_empty(){return crea==comp1;
}int buffer1_is_full(){return (crea+1)%CAPACITY==comp1;
}int buffer2_is_empty(){return comp2==cons;
}int buffer2_is_full(){return (cons+1)%CAPACITY==comp2;
}int get_item1(){int item;item=buffer1[comp1];comp1=(comp1+1)%CAPACITY;return item;
}int get_item2(){int item;item=buffer2[cons];cons=(cons+1)%CAPACITY;return item;
}int put_item1(int item){buffer1[crea]=item;crea=(crea+1)%CAPACITY;
}int put_item2(int item){buffer2[comp2]=item;comp2=(comp2+1)%CAPACITY;
}pthread_mutex_t mutex1;
pthread_cond_t wait_empty_buffer1;
pthread_cond_t wait_full_buffer1;pthread_mutex_t mutex2;
pthread_cond_t wait_empty_buffer2;
pthread_cond_t wait_full_buffer2;#define ITEM_COUNT  (CAPACITY *2)void *consumer(void *arg){int i;int item;for(i=0;i<ITEM_COUNT;i++){pthread_mutex_lock(&mutex2);while(buffer2_is_empty())pthread_cond_wait(&wait_full_buffer2,&mutex2);item=get_item2();printf("                  consume item:%c\n",item);pthread_cond_signal(&wait_empty_buffer2);pthread_mutex_unlock(&mutex2);}return NULL;
}void *computer(void *arg){int i;int item;for(i=0;i<ITEM_COUNT;i++){pthread_mutex_lock(&mutex1);while(buffer1_is_empty())pthread_cond_wait(&wait_full_buffer1,&mutex1);item=get_item1();printf("          computer get item:%c\n",item);item-=32;pthread_cond_signal(&wait_empty_buffer1);pthread_mutex_unlock(&mutex1);pthread_mutex_lock(&mutex2);while(buffer2_is_full())pthread_cond_wait(&wait_empty_buffer2,&mutex2);put_item2(item);printf("          computer put item:%c\n",item);pthread_cond_signal(&wait_full_buffer2);pthread_mutex_unlock(&mutex2);}return NULL;
}void *create(void *arg){int i;int item;for(i=0;i<ITEM_COUNT;i++){pthread_mutex_lock(&mutex1);while(buffer1_is_full())pthread_cond_wait(&wait_empty_buffer1,&mutex1);item='a'+i;put_item1(item);printf("create item:%c\n",item);pthread_cond_signal(&wait_full_buffer1);pthread_mutex_unlock(&mutex1);}return NULL;
}int main(){pthread_t consumer_tid;pthread_t computer_tid;pthread_mutex_init(&mutex1,NULL);pthread_mutex_init(&mutex2,NULL);pthread_cond_init(&wait_empty_buffer1,NULL);pthread_cond_init(&wait_full_buffer1,NULL);pthread_cond_init(&wait_empty_buffer2,NULL);pthread_cond_init(&wait_full_buffer2,NULL);pthread_create(&consumer_tid,NULL,consumer,NULL);pthread_create(&computer_tid,NULL,computer,NULL);create(NULL);pthread_join(consumer_tid,NULL);pthread_join(computer_tid,NULL);pthread_mutex_destroy(&mutex1);pthread_mutex_destroy(&mutex2);return 0;
}

這里寫圖片描述
歡迎留言交流。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375860.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淘寶代碼和html區別,taobao.html

taobao主題市場女裝 /男裝 /內衣 >鞋靴 /箱包 /配件 >童裝玩具 /孕產 /用品 >家電 /數碼 /手機 >女裝 /男裝 /內衣 >鞋靴 /箱包 /配件 >童裝玩具 /孕產 /用品 >家電 /數碼 /手機 >女裝 /男裝 /內衣 >鞋靴 /箱包 /配件 >童裝玩具 /孕產 /用品 >…

程序各個段text,data,bss,stack,heap

網上找了一堆資料學習一下,了解這些, 有助于規化程序結構,優化代碼; 使用gcc編譯出來的程序,用size可以查看程序結構和大小, 如 1: #size hello 2: Text data bss dec hex filename 3: 778 200 4 982 3D6 hello 所以一個可執行的程序文件,結構分三部分: .text 代碼段,用來存…

讓 keil MDK 支持C99

打開options fot target-> C/C 在 Misc Controls 中添加 --c99. 轉載于:https://www.cnblogs.com/svchao/p/4585034.html

html從日期格式中獲取年,js轉換日期格式(Js獲取年月日及時間轉換)

1、獲取年、月、日和將時間戳轉換成日期格式// 簡單的一句代碼var date new Date(時間戳); //獲取一個時間對象/**1. 下面是獲取時間日期的方法&#xff0c;需要什么樣的格式自己拼接起來就好了2. 更多好用的方法可以在這查到 -> http://www.w3school.com.cn/jsref/jsref_o…

月半小夜曲

轉載于:https://www.cnblogs.com/yesihoang/p/4588319.html

操作系統上機作業-- 使用信號量解決生產者、計算者、消費者問題(多線程)

pc2.c: 使用信號量解決生產者、計算者、消費者問題 ? 功能和前面的實驗相同&#xff0c;使用信號量解決 實現思路: 生產者、計算者、消費者三者之間的關系和上一個編程任務一樣&#xff0c;不一樣的是&#xff0c;將互斥量、條件變量封裝起來作為信號量&#xff0c;處理方…

Singleton 單件

模式分類 從目的來看&#xff1a; -創建型&#xff08;Creational&#xff09;模式&#xff1a;負責對象創建 -結構型&#xff08;Structural&#xff09;模式&#xff1a;處理類與對象間的組合 -行為型&#xff08;Behavioral&#xff09;模式&#xff1a;類與對象交互中的職責…

引入struts html標簽,【學習】Struts標簽之html標簽

html:multiboxhtml:multibox標簽生成多個checkbox。當您要使用大量的checkbox時使用這個標簽非常方便&#xff0c;可以使您避免在ActionForm中聲明大量的boolean類型的變量&#xff0c;帶之以一個數組就行了。注意:為了正確的處理沒有選中的checkbox您必須在reset()中設置數組的…

10個利用Eclipse調試Java的常見技巧

http://www.open-open.com/news/view/1ad9099 閱讀目錄 1. Conditional Breakpoint2. Exception Breakpoint3. Watch Point4. Evaluation (Display or Inspect or Watch)5. Change Variable Values6. Stop in Main7. Environment Variables8. Drop to Frame9. Step Filter10. S…

操作系統上機作業--創建N個線程(多線程)

ring.c: 創建N個線程&#xff0c;它們構成一個環 ? 創建N個線程&#xff1a;T1、T2、T3、… TN ? T1向T2發送整數1 ? T2收到后將整數加1 ? T2向T3發送整數2 ? T3收到后將整數加1 ? T3向T4發送整數3 ? … ? TN收到后將整數加1 ? TN向T1發送整數N 實…

管理者不應該做的事

1.責備讓每個人明白出錯的時候要承擔責任&#xff0c;而不是責任他&#xff0c;出問題要幫他認識問題&#xff0c;并且給他提供解決辦法&#xff0c;先了解來龍去脈&#xff0c;看看是哪里出了問題&#xff0c;是否能避免 2.印象沒有人會因為你的服裝、你的車、你的財產、你的頭…

臺式計算機網線,臺式電腦如何連接寬帶_臺式電腦如何連接網線

2017-03-11 21:36:28電腦直接撥號上網(有寬帶賬號和密碼)或者自動獲取IP(有帳號沒密碼)上方式設置見圖2016-12-10 13:29:30右擊網上鄰居&#xff0c;點屬性&#xff0c;創建一個新的連接&#xff0c;按照下一步下一步的步驟就可以了&#xff0c;然后成功之后輸入你的寬帶號碼和…

棧的應用--漢諾塔

#include<stdio.h>void move(char x,int n,char y){printf("%d號盤 %c柱 ---> %c柱\n",n,x,y); }void hanoi(int n,char x,char y,char z){if(n1){move(x,1,z);}else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);} }int main(){int n;char xX;char yY;c…

Linux split命令實例

曾經是否想要把一個大文件分割成多個小文件&#xff1f;比如一個5gb日志文件&#xff0c;我們需要把它分成多個小文件&#xff0c;這樣我們才有可能使用普通的文本編輯器讀取它。有時我們需要傳輸20gb的大文件到另一臺服務器&#xff0c;這就需要我們把它分割成多個文件&#x…

PIC18F452之1602自定義字符

源&#xff1a;PIC18F452之1602自定義字符轉載于:https://www.cnblogs.com/LittleTiger/p/4595823.html

美國計算機工程專業,美國計算機工程專業哪些學校比較好

這里有一份相對比較專業點的排名表。希望能給你當一個參考。個人建議,選擇學校還是要根據自己的實際需要,以及個人情況來決定。不一定,排名最高的學校就是好的。要多多考慮一下自己的情況。如果真的需要推薦,建議樓主寫出自己的情況,以及內心的想法,當然還要包括財力。2008美國…

NewCode----求數列的和

題目描述 數列的第一項為n&#xff0c;以后各項為前一項的平方根&#xff0c;求數列的前m項的和。 輸入描述: 輸入數據有多組&#xff0c;每組占一行&#xff0c;由兩個整數n&#xff08;n < 10000&#xff09;和m(m < 1000)組成&#xff0c;n和m的含義如前所述。 輸…

Hadoop源碼分析7: IPC流程(1) 主要類

1.服務器端主要類 public abstractclass Server { public static final ByteBuffer HEADER ByteBuffer.wrap("hrpc".getBytes()); public static final byte CURRENT_VERSION 4; private static finalThreadLocal&#xff1c;Server&#xff1e; SERVER new ThreadLo…

html5 服務器手機編程,html5實現服務器發送事件

頁面DocumentStatus:Server Datajs代碼創建一個新的 EventSource 對象&#xff0c;然后規定發送更新的頁面的 URL(本例中是 "demo_sse.php")每接收到一次更新&#xff0c;就會發生 onmessage 事件當 onmessage 事件發生時&#xff0c;把已接收的數據推入 id 為 "…

【動態規劃】【多重背包】[HDU 1291]悼念512汶川大地震遇難同胞――珍惜現在,感恩生活...

這道題目是一個多重背包的題目&#xff0c;多重背包實際上就是把整個物品的件數拆分成a0?20a1?21a2?22...an?2n且a0或1這樣每一次最優解實際上就是在之前的基礎上進行的最優解的累加&#xff0c;但是發現如果物品數量不是恰好是某幾個數之和&#xff0c;那么就會出現有幾個…