寵物集市-寵物集市華東、華南、華北排行榜一覽表
700
2025-04-01
本文目錄一覽:
#include?<windows.h關于操作系統生產者消費者問題和操作系統生產者消費者問題課程設計的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。 操作系統生產者消費者問題的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于操作系統生產者消費者問題課程設計、操作系統生產者消費者問題的信息別忘了在本站進行查找喔。
#include?<iostream.h
#include<stdio.h
#include<stdlib.h
????
const?unsigned?short?SIZE_OF_BUFFER?=?10;???//緩沖區長度
unsigned?short?ProductID?=?0;???????????????//產品號
unsigned?short?ConsumeID?=?0;???????????????//將被消耗的產品號
unsigned?short?in?=?0;??????????????????????//產品進緩沖區時的下標
unsigned?short?out?=?0;?????????????????????//產品出緩沖區時的下標
????
int?g_buffer[SIZE_OF_BUFFER];???????????????//緩沖區是個循環隊列
bool?g_continue?=?true;?????????????????????//控制程序結束
HANDLE?g_hMutex;????????????????????????????//用于線程間的互斥
HANDLE?g_hFullItems;????????????????????????//緩沖區中被占用的項
HANDLE?g_hEmptyItems;???????????????????????//緩沖區中的空項
????
DWORD??WINAPI?Producer(LPVOID);??????????????//生產者線程,dword?變量類型的內存占位
DWORD??WINAPI?Consumer(LPVOID);??????????????//消費者線程
????
int?main()
{
????????//創建各個互斥信號
????????g_hMutex?=?CreateMutex(NULL,FALSE,NULL);
????????g_hFullItems?=?CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);//創建信號燈,createsemaphore常常被用作多線程同步
????????g_hEmptyItems?=?CreateSemaphore(NULL,SIZE_OF_BUFFER,
????????????????????????????????????????SIZE_OF_BUFFER,NULL);
????????//緩沖區初始化
????????for?(int?i?=?0;?i<?SIZE_OF_BUFFER;++i){
????????????g_buffer[i]?=?-1;???//當值為-1時該項為空
????????}????????
????????
???????const?unsigned?short?PRODUCERS_COUNT?=3;???????//生產者的個數
???????const?unsigned?short?CONSUMERS_COUNT?=2;???????//消費者的個數
????
????????//總的線程數
????????const?unsigned?short?THREADS_COUNT?=?PRODUCERS_COUNT+CONSUMERS_COUNT;
????
????????HANDLE?hThreads[THREADS_COUNT];?????//各線程的handle
????????DWORD?producerID[PRODUCERS_COUNT];??//生產者線程的標識符
????????DWORD?consumerID[CONSUMERS_COUNT];??//消費者線程的標識符
????
????????//創建生產者線程
????????for?(?i=0;i<PRODUCERS_COUNT;++i){
????????????hThreads[i]
???????????????=CreateThread(NULL,0,Producer,NULL,0,producerID[i]);//CreateThread是window提供的API函數
????????????if?(hThreads[i]==NULL)?return?-1;???????????????????????//用此函數可創建一個線程
????????}
????????//創建消費者線程
????????for?(i=0;i<CONSUMERS_COUNT;++i){
????????????hThreads[PRODUCERS_COUNT+i]
???????????????=CreateThread(NULL,0,Consumer,NULL,0,consumerID[i]);
????????????if?(hThreads[i]==NULL)?return?-1;
????????}
????
???????while(g_continue){
????????????if(getchar()){??//按回車后終止程序運行
????????????????g_continue?=?false;
????????????}
???????}???
????????return?0;
????}
????
????//生產一個產品。簡單模擬了一下,僅輸出新產品的ID號
????void?Produce()
????{
????????cout?<<endl<<?"Producing?"?<<?++ProductID?<<?"?...?";
????????cout?<<?"Succeed"?<<?endl;
???}
????
????//把新生產的產品放入緩沖區
????void?Append()
????{
??????cout?<<?"Appending?a?product?...?";
??????g_buffer[in]?=?ProductID;
??????in?=?(in+1)%SIZE_OF_BUFFER;
??????cout?<<?"Succeed"?<<?endl;
???
??????//輸出緩沖區當前的狀態
??????for?(int?i=0;i<SIZE_OF_BUFFER;++i){
???????????cout?<<?i?<<":?";
???????????if?(g_buffer[i]==-1)
???????????????cout?<<?"null";
???????????else
???????????????cout?<<?g_buffer[i];
????????????if?(i==in)?cout?<<?'\t'?<<?"?<--?生產";
????????????if?(i==out)?cout?<<?'\t'?<<?"?<--?消費";
???????????????cout?<<?endl;
????????}
????}
???
???//從緩沖區中取出一個產品
???void?Take()
???{
???????cout?<<?endl<<"Taking?a?product?...?";
???????ConsumeID?=?g_buffer[out];
???????g_buffer[out]=?-1;
???????out?=?(out+1)%SIZE_OF_BUFFER;
???????cout?<<?ConsumeID<<"--Succeed"?<<?endl;
????
???????//輸出緩沖區當前的狀態
???????for?(int?i=0;i<SIZE_OF_BUFFER;++i){
??????????cout?<<?i?<<":?";
????????????if?(g_buffer[i]==-1)
??????????????cout?<<?"null";
????????????else
???????????????cout?<<?g_buffer[i];
????????????if?(i==in)?cout?<<?'\t'?<<?"?<--?生產";
????????????if?(i==out)?cout?<<?'\t'?<<?"?<--?消費";
????????????cout?<<endl;
???????}
????}
???
????//消耗一個產品
????void?Consume()
????{
????????cout?<<?"Consuming?"?<<?ConsumeID?<<?"?...?";
????????cout?<<?"Succeed"?<<?endl;
????}
????
?//生產者
?DWORD??WINAPI?Producer(LPVOID?lpPara)
????{
????????while(g_continue){
????????????int?i=rand()%5;
????????????Sleep(i*1000);
????????????WaitForSingleObject(g_hEmptyItems,INFINITE);//等待信號燈
????????????WaitForSingleObject(g_hMutex,INFINITE);
????????????Produce();
????????????Append();?
????????????ReleaseMutex(g_hMutex);
????????????ReleaseSemaphore(g_hFullItems,1,NULL);
???????}
????????return?0;
????}
????
????//消費者
????DWORD??WINAPI?Consumer(LPVOID?lpPara)
????{
????????while(g_continue){
????????????int?i=rand()%5;
????????????Sleep(i*1000);//該線程釋放當前的控制權1500毫秒,讓系統調度其他線程
????????????WaitForSingleObject(g_hFullItems,INFINITE);
????????????WaitForSingleObject(g_hMutex,INFINITE);
????????????Take();
????????????Consume();
????????????ReleaseMutex(g_hMutex);
????????????ReleaseSemaphore(g_hEmptyItems,1,NULL);
????????}
????????return?0;
???}
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。