




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、PV操作(哲學(xué)家問題)給每個哲學(xué)家編號,規(guī)定奇數(shù)號的哲學(xué)家先拿他的左筷子,然后再去拿他的右筷子;而偶數(shù)號的哲學(xué)家則相反。這樣總可以保證至少有一個哲學(xué)家可以進餐。#include <windows.h> #include <iostream> #include <process.h> #include <cstdlib> #include <ctime> using namespace std; DWORD WINAPI philosopher(LPVOID lpParameter); void thinking(int); void
2、eating(int); void waiting(int); void print(int ,const char *); /全局變量 CRITICAL_SECTION crout;/這個變量用來保證輸出時不會競爭 CRITICAL_SECTION fork5;/定義五個臨界變量,代表五更筷子 int main(int argc,char *argv) HANDLE hthread5; int i; int arg5; int count = 5; long a=0; unsigned long retval; InitializeCriticalSection(&crout); /
3、初始化臨界變量 for(i=0;i<5;i+) InitializeCriticalSection(fork + i); /創(chuàng)建五個哲學(xué)家 for(i = 0; i<5;i+) argi = i; hthreadi = CreateThread(NULL, 0, philosopher, (void*)(arg+i), 0, NULL); for(a=0;a<30000000;a+); if( hthreadi = INVALID_HANDLE_VALUE)/如果線程創(chuàng)建失敗返回-1 cerr << "error while create thread
4、" << i <<endl; cerr << "error code : "<< GetLastError() <<endl; /等待所有線程結(jié)束 retval = WaitForMultipleObjects(5,hthread,true,INFINITE);/等待多個線程 for(a=0;a<30000000;a+); if(retval = WAIT_FAILED) cerr<< "wait error,error code: "<<GetLastE
5、rror()<<endl; for(i = 0; i<5;i+) for(a=0;a<30000000;a+); if(CloseHandle(hthreadi) = false)/關(guān)閉句柄 cerr << "error while close thread " <<i<<endl; cerr << "error code: "<<GetLastError()<<endl; return 0; DWORD WINAPI philosopher(LPVOID l
6、pParameter) long a=0; int n = (int *)lpParameter)0; for(a=0;a<30000000;a+); print(n," is in!"); /srand(time(NULL); while(true) thinking(n); waiting(n); eating(n); print(n," is out!"); return n; void thinking(int k) long a=0;for(a=0;a<30000000;a+); print(k," is thinking
7、."); Sleep(1); /Sleep(rand() %100) *5); void eating(int k) long a=0;for(a=0;a<30000000;a+); print(k," is eating."); /Sleep(rand()%100) *5); Sleep(1); LeaveCriticalSection(fork + (k+1)%5);/放下右邊的筷子 /print(k," give left"); LeaveCriticalSection(fork + k);/放下左邊的筷子 /print(k,&qu
8、ot; give right"); void waiting(int k) long a=0;for(a=0;a<30000000;a+); print(k," is waiting."); Sleep(1); EnterCriticalSection(fork + k);/獲得左邊的筷子 /print(k," take left"); EnterCriticalSection(fork + (k + 1)%5);/獲得右邊的筷子 /print(k," take right"); void print(int who,
9、const char *str) long a=0;for(a=0;a<30000000;a+); EnterCriticalSection(&crout); cout<<"process "<<who<<str<<endl; LeaveCriticalSection(&crout); 操作截圖PV操作(生產(chǎn)者-消費者問題)解決方法一:實現(xiàn)思想,我們在產(chǎn)生足夠的產(chǎn)品后,喚醒消費者把生產(chǎn)的產(chǎn)品全部消耗,讓后在喚醒生產(chǎn)者生產(chǎn)商品。 /* 用信號量解決生產(chǎn)者消費者問題 */解決方法生產(chǎn)者生產(chǎn)10間產(chǎn)品,喚醒消費
10、者,消費完后,喚醒生產(chǎn)者 #include <STDIO.H> #define N 10 typedef int semaphore; /* 信號量是一種特殊的整型變量 */ semaphore mutex=1; /* 互斥訪問 */ semaphore empty=N; /* 記錄緩沖區(qū)中空的槽數(shù) */ semaphore full=0; /* 記錄緩沖區(qū)中滿的槽數(shù)*/ semaphore bufN; /* 有N個槽數(shù)的緩沖區(qū)bufN,并實現(xiàn)循環(huán)緩沖隊列 */ semaphore front=0, rear=0; void p(semaphore *x) /* p操作 */ *x
11、=(*x)-1; void v(semaphore *y) /* v操作 */ *y=(*y)+1; void produce_item(int *item_ptr) /*printf("produce an itemn");*/ *item_ptr='m' /* 'm' is "man滿" */ void enter_item(int x) front=(front+1)%N; buffront=x; printf("enter_item %c to buf%dn", buffront, front)
12、; void remove_item(int *yy) rear=(rear+1)%N; printf("remove_item %c from buf%d", bufrear, rear); *yy=bufrear; bufrear='k' /* 'k' is "kong空" */ printf(" so the buf%d changed to empty-%cn", rear, bufrear); void consume_item(int y) printf("cosume the i
13、tem :the screem print %cn", y); void producer(void); void consumer(void); /* 生產(chǎn)者 */ void producer(void) int item; while(1) produce_item(&item); p(&empty); /* 遞減空槽數(shù) */ p(&mutex); /* 進入臨界區(qū) */ enter_item(item); /* 將一個新的數(shù)據(jù)項放入緩沖區(qū) */ v(&mutex); /* 離開臨界區(qū) */ v(&full); /* 遞增滿槽數(shù) */ if
14、(full=N) /* 若緩沖區(qū)滿的話,喚醒消費者進程 */ consumer(); /* 消費者 */ void consumer(void) int get_item; while(1) p(&full); /* 遞減滿槽數(shù) */ p(&mutex); /* 進入臨界區(qū) */ remove_item(&get_item); /* 從緩沖區(qū)中取走一個數(shù)據(jù)項 */ v(&mutex); /* 離開臨界區(qū) */ v(&empty); /* 遞增空槽數(shù) */ consume_item(get_item); /* 對數(shù)據(jù)項進行操作(消費)*/ if(empty
15、=N) /* 若緩沖區(qū)全空的話,喚生產(chǎn)者進程 */ producer(); /* 調(diào)用生產(chǎn)者消費者進程實現(xiàn)進程間同步 */ main() producer(); return 0; 生產(chǎn)者消費者問題解決方法二:因為實際情況是生產(chǎn)消費速度不會一致,也不會想方法一一樣,消費完后在生產(chǎn)。我們生產(chǎn)者要保持滿足消費者的需求。調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個數(shù)多于消費者個數(shù)時,生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待,可以保證消費者可以一直消費。實現(xiàn)代碼:#include <windows.h>#include <iostream>const unsigned s
16、hort SIZE_OF_BUFFER = 10; /緩沖區(qū)長度unsigned short ProductID = 0; /產(chǎn)品號unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號unsigned short in = 0; /產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個循環(huán)隊列bool g_continue = true; /控制程序結(jié)束HANDLE g_hMutex; /用于線程間的互斥HANDLE g_hFullSemaphore;
17、/當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時迫使消費者等待DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID); /消費者線程int main() /創(chuàng)建各個互斥信號 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSem
18、aphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個數(shù)多于消費者個數(shù)時, /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費者的個數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_C
19、OUNT; /各線程的handle DWORD producerIDCONSUMERS_COUNT; /生產(chǎn)者線程的標識符 DWORD consumerIDTHREADS_COUNT; /消費者線程的標識符 /創(chuàng)建生產(chǎn)者線程 for (int i=0;i<PRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)建消費者線程 for ( int i=0;i<CONSUMERS_COUNT;+i) hThre
20、adsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi); if (hThreadsi=NULL) return -1; while(g_continue) if(getchar() /按回車后終止程序運行 g_continue = false; return 0;/生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號void Produce() std:cerr << "Producing " << +ProductID << " . &
21、quot; std:cerr << "Succeed" << std:endl;/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)void Append() std:cerr << "Appending a product . " g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; std:cerr << "Succeed" << std:endl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i<SIZE_OF_BUFFER;+i)
22、std:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費" std:cout << std:endl; /從緩沖區(qū)中取出一個產(chǎn)品void Take() std:cerr << "Taking a product . " ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; std:cerr << "Succeed" << std:endl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i<SIZE_OF_BUFFER;+i) std:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 土木工程材料??荚囶}+參考答案
- 個人工作實習(xí)心得體會
- 單獨中介合同范本
- 兌房押金合同范例
- epc合同和總包合同范本
- 三年級下學(xué)期語文教學(xué)總結(jié)
- 中式烹調(diào)師中級練習(xí)題及參考答案
- 養(yǎng)殖蚯蚓合同范本
- 單獨招生機電類復(fù)習(xí)題
- 七色花幼兒教學(xué)反思
- 國網(wǎng)新聞宣傳與企業(yè)文化管理專責(zé)考試題庫及答案
- 氫氣儲存和運輸 課件 第1、2章 氫氣存儲與運輸概述、高壓氣態(tài)儲運氫
- 三年級地方課教案
- 涉外法律文書寫作
- 旅游大數(shù)據(jù)理論、技術(shù)與應(yīng)用課程方案、案例分析
- 1.裝配式建筑概述(裝配式混凝土結(jié)構(gòu)施工技術(shù))
- 新零件的成熟保障MLA
- 《董存瑞舍身炸碉堡》PPT課件新
- 《計算機與網(wǎng)絡(luò)技術(shù)基礎(chǔ)》
- 下穿高速鐵路監(jiān)測方案
- 手機號碼段歸屬地數(shù)據(jù)庫(2016年3月)
評論
0/150
提交評論