進(jìn)程控制系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)_第1頁(yè)
進(jìn)程控制系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)_第2頁(yè)
進(jìn)程控制系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)_第3頁(yè)
進(jìn)程控制系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)_第4頁(yè)
進(jìn)程控制系統(tǒng)設(shè)計(jì)說(shuō)明書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 中 北 大 學(xué) 課程設(shè)計(jì)說(shuō)明書(shū)學(xué) 院、系:軟件學(xué)院專 業(yè):軟件工程班 級(jí):13140A05學(xué) 生 姓 名:學(xué) 號(hào):設(shè) 計(jì) 題 目:基于Windows的線程控制與同步 起 迄 日 期: 2015年12月28日2016年1月8日指 導(dǎo) 教 師: 日期: 2015年12月25日一、設(shè)計(jì)目的 進(jìn)程同步是處理機(jī)管理中一個(gè)重要的概念。本設(shè)計(jì)要求學(xué)生理解和掌握Windows中線程控制與同步機(jī)制的相關(guān)API函數(shù)的功能,能夠利用這些函數(shù)進(jìn)行編程。2、 任務(wù)概述(1) 實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題。(2) 實(shí)現(xiàn)讀/寫(xiě)者問(wèn)題。(3) 實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題。3、 總體設(shè)計(jì)(1) 生產(chǎn)者-消費(fèi)者問(wèn)題。是一個(gè)多線程同步問(wèn)題的經(jīng)

2、典案例。該問(wèn)題描述了兩個(gè)共享固定大小緩沖區(qū)的線程即所謂的“生產(chǎn)者”和“消費(fèi)者”在實(shí)際運(yùn)行時(shí)會(huì)發(fā)生的問(wèn)題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過(guò)程。與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問(wèn)題的關(guān)鍵就是要保證生產(chǎn)者不會(huì)在緩沖區(qū)滿時(shí)加入數(shù)據(jù),消費(fèi)者也不會(huì)在緩沖區(qū)中空時(shí)消耗數(shù)據(jù)。(2) 讀/寫(xiě)者問(wèn)題。創(chuàng)建一個(gè)控制臺(tái)程序,此程序包含n個(gè)線程。用這n個(gè)線程來(lái)表示n個(gè)讀者或?qū)懻?。每個(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件(后面有介紹)的要求進(jìn)行讀寫(xiě)操作。用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先或?qū)懻邇?yōu)先的讀者-寫(xiě)者問(wèn)題。(3)實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題。用來(lái)演示在并行計(jì)算中多線程同步(Synchronization)

3、時(shí)產(chǎn)生的問(wèn)題。在1971年,著名的計(jì)算機(jī)科學(xué)家艾茲格迪科斯徹提出了一個(gè)同步問(wèn)題,即假設(shè)有五臺(tái)計(jì)算機(jī)都試圖訪問(wèn)五份共享的磁帶驅(qū)動(dòng)器。稍后,這個(gè)問(wèn)題被托尼霍爾重新表述為哲學(xué)家就餐問(wèn)題。這個(gè)問(wèn)題可以用來(lái)解釋死鎖和資源耗盡。有服務(wù)生解法,資源分級(jí)解法,Chandy/Misra解法。4、 詳細(xì)設(shè)計(jì)函數(shù)(1)生產(chǎn)者-消費(fèi)者問(wèn)題#include #include #include #include #define MAX 20 /定義緩沖池的最大容量是20 int count; void Proclucer() int k,a=0;while(1) if(count = MAX) printf(緩沖池已滿!

4、等待 2 秒!n); Sleep(1000); else k=rand(); if(k%2=0) a+; count+; printf(生產(chǎn)了一個(gè)產(chǎn)品!當(dāng)前產(chǎn)品的數(shù)量是: %d 生產(chǎn)產(chǎn)品總數(shù):%d nn,count,a); Sleep(600); void Consumer() int k,b=0; while(1) if(count = 0) printf(緩沖池已空!等待 2 秒!n); Sleep(1000); else k=rand(); if(k%2!=0) b+; count-; printf(取出了一個(gè)產(chǎn)品!當(dāng)前產(chǎn)品的數(shù)量是: %d 取出產(chǎn)品總數(shù):%dn,count,b); Sl

5、eep(600); int tStop() /創(chuàng)建一個(gè)停止函數(shù) getch(); return 11; void Start() int m; HANDLE ahThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Proclucer,NULL,0,NULL); HANDLE bhThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Consumer,NULL,0,NULL); HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)tS

6、top,NULL,0,NULL); m=tStop(); if(m=11) CloseHandle(ahThread); CloseHandle(bhThread); CloseHandle(hThread); printf(nClose Thread Success!nh); int main() Start(); printf(n);(2)讀/寫(xiě)者問(wèn)題#include #include #include /設(shè)置控制臺(tái)輸出顏色 BOOL SetConsoleColor(WORD wAttributes) HANDLE hConsole = GetStdHandle(STD_OUTPUT_HA

7、NDLE); if (hConsole = INVALID_HANDLE_VALUE) return FALSE; return SetConsoleTextAttribute(hConsole, wAttributes); const int READER_NUM = 5; /讀者個(gè)數(shù) /關(guān)鍵段和事件 CRITICAL_SECTION g_cs, g_cs_writer_count; HANDLE g_hEventWriter, g_hEventNoReader; int g_nReaderCount; /讀者線程輸出函數(shù)(變參函數(shù)的實(shí)現(xiàn)) void ReaderPrintf(char *p

8、szFormat, .) va_list pArgList; va_start(pArgList, pszFormat); EnterCriticalSection(&g_cs); vfprintf(stdout, pszFormat, pArgList); LeaveCriticalSection(&g_cs); va_end(pArgList); /讀者線程函數(shù) unsigned int _stdcall ReaderThreadFun(PVOID pM) ReaderPrintf( 編號(hào)為%d的讀者進(jìn)入等待中.n, GetCurrentThreadId(); /等待寫(xiě)者完成 WaitFo

9、rSingleObject(g_hEventWriter, INFINITE); /讀者個(gè)數(shù)增加 EnterCriticalSection(&g_cs_writer_count); g_nReaderCount+; if (g_nReaderCount = 1) ResetEvent(g_hEventNoReader); LeaveCriticalSection(&g_cs_writer_count); /讀取文件 ReaderPrintf( 編號(hào)為%d的讀者開(kāi)始讀取文件.n, GetCurrentThreadId(); Sleep(rand() % 100); /結(jié)束閱讀,讀者個(gè)數(shù)減小,空位

10、增加 ReaderPrintf( 編號(hào)為%d的讀者結(jié)束讀取文件n, GetCurrentThreadId(); /讀者個(gè)數(shù)減少 EnterCriticalSection(&g_cs_writer_count); g_nReaderCount-; if (g_nReaderCount = 0) SetEvent(g_hEventNoReader); LeaveCriticalSection(&g_cs_writer_count); return 0; /寫(xiě)者線程輸出函數(shù) void WriterPrintf(char *pszStr) EnterCriticalSection(&g_cs); Se

11、tConsoleColor(FOREGROUND_RED); printf( %sn, pszStr); SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); LeaveCriticalSection(&g_cs); /寫(xiě)者線程函數(shù) unsigned int _stdcall WriterThreadFun(PVOID pM) WriterPrintf( -n 寫(xiě)者線程進(jìn)入等待中n -); /等待讀文件的讀者為零 WaitForSingleObject(g_hEventNoReader, INFINITE);

12、 /標(biāo)記寫(xiě)者正在寫(xiě)文件 ResetEvent(g_hEventWriter); /寫(xiě)文件 WriterPrintf( -n 寫(xiě)者開(kāi)始寫(xiě)文件n -); Sleep(rand() % 100); WriterPrintf( -n 寫(xiě)者結(jié)束寫(xiě)文件n -); /標(biāo)記寫(xiě)者結(jié)束寫(xiě)文件 SetEvent(g_hEventWriter); return 0; int main() printf(-讀者寫(xiě)者問(wèn)題-13140A05班12組-n); /初始化事件和信號(hào)量 InitializeCriticalSection(&g_cs); InitializeCriticalSection(&g_cs_writer_

13、count); /手動(dòng)置位,初始已觸發(fā) g_hEventWriter = CreateEvent(NULL, TRUE, TRUE, NULL); g_hEventNoReader = CreateEvent(NULL, FALSE, TRUE, NULL); g_nReaderCount = 0; int i; HANDLE hThreadREADER_NUM + 1; /先啟動(dòng)二個(gè)讀者線程 for (i = 1; i = 2; i+) hThreadi = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL); /啟

14、動(dòng)寫(xiě)者線程 hThread0 = (HANDLE)_beginthreadex(NULL, 0, WriterThreadFun, NULL, 0, NULL); Sleep(50); /最后啟動(dòng)其它讀者結(jié)程 for ( ; i = READER_NUM; i+) hThreadi = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL); WaitForMultipleObjects(READER_NUM + 1, hThread, TRUE, INFINITE); for (i = 0; i READER_NUM +

15、 1; i+) CloseHandle(hThreadi); /銷毀事件和信號(hào)量 CloseHandle(g_hEventWriter); CloseHandle(g_hEventNoReader); DeleteCriticalSection(&g_cs); DeleteCriticalSection(&g_cs_writer_count); /return 0; system(pause);(3) 實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題#define WIN32_LEAN_AND_MEAN#include #include #include DWORD WINAPI PhilosoperThreadFunc(

16、LPVOID);#define PHILOSOPERS 5/定義5個(gè)哲學(xué)家 HANDLE chop_sticksPHILOSOPERS;HANDLE threadsPHILOSOPERS;int main(int argc, char* argv)for (int i = 0; iDESKTOPHORZRES; +i)chop_sticksi = CreateMutex( NULL, /缺省安全性 FALSE, /初始時(shí)擁有,此時(shí)互斥體為無(wú)信號(hào)狀態(tài) NULL /匿名的 );/創(chuàng)建互斥體 for (int i = 0; i0) ? i - 1 : PHILOSOPERS;srand(GetTickCount();/調(diào)用隨機(jī)數(shù) while (1)Sleep(rand() % 8) * 500 + 500);/隨機(jī)等待幾秒鐘 printf(哲學(xué)家 %d 想吃飯n, i);WaitForMultipleObjects(2, my

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論