試驗七線程的同步與互斥_第1頁
試驗七線程的同步與互斥_第2頁
試驗七線程的同步與互斥_第3頁
試驗七線程的同步與互斥_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統(tǒng) 實驗七 學號:姓名:實驗七 線程的同步與互斥一.實驗目的:線程是現(xiàn)代操作系統(tǒng)中的重要概念之一。引入線程后,操作系統(tǒng)分配資源還是以進程為單位,但處理機卻不再以進程,而是以線程為單位進行分配。引入線程后,不但能有效提高系統(tǒng)中程序的并發(fā)道數(shù),而且還能減少系統(tǒng)并發(fā)操作帶來 的切換開銷。我們知道,為了對并發(fā)的線程(進程)進行同步與互斥,各種操作系統(tǒng)都相繼 添加了對互斥體、信號量機制的支持。通過該實驗,體會線程的同步與互斥,并進一步理解臨界資源的互斥訪問、信號量的使用方法等,從而體會操作系統(tǒng)對線程(進程)的同步、互斥的處理能力。二.實驗要求:在老師的指導下完成實驗。要求寫出實驗的具體步驟,給出實

2、驗結果,解釋實驗中出現(xiàn)的現(xiàn)象。三.實驗題目:.建立兩個飛機售票點,用線程shopl和shop2表示它們。Shopl、shop2各自進行自己的 售票活動(即它們的售票活動是并發(fā)的)。假如一趟班機有座位200個,所能售的飛機票標號應為200, 199, 198,,1。在該實驗中,先讓兩個售票點各自不加控制地進行獨立售票,則可能會發(fā)生與實際不相符的混亂情況,甚至還可能售出標號為0的票。請在Visual C+下用代碼實現(xiàn)該實驗,想一想,得出這樣的實驗結果是為什么?程序代碼如下:#include#includeDWORD WINAPI Shop1();DWORD WINAPI Shop2();int t

3、ickets=200;/ 有200張飛機票待售int main()/開啟兩個線程開始售票HANDLEhThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Shop1,NULL,0,NULL);HANDLEhThread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Shop2,NULL,0,NULL);Sleep(10000);CloseHandle(hThread1);CloseHandle(hThread2);Sleep(1000);return 0;/定義售票點1DWORD WINAPI Sh

4、op1()while(1)if(tickets0)Sleep(1);printf(Shop1 is selling a ticket:%dn.n,tickets);tickets-;操作系統(tǒng)實驗七 學號:姓名:)elsereturn 0;)/定義售票點2DWORD WINAPI Shop2()while(1)if(tickets0)Sleep(1);printf(Shop2 is selling a ticket:%dn.n,tickets); tickets-;)elsereturn 0;)實驗結果如下:Shupi iiiSiop2 isShopl isShop2 isSJ)op2 isSh

5、opl isShop2Shupl isShopZ isEhnpl isShnp2 isShopl iscelling a sellingf a selling a celling a celling 通 selling a ellifig a celling a selling a selling a selling a celling aticketticket -10ticket:號ticket : 7ticket : 7ticket:7ticket:&ticket:5ticket t4ticket: 3ticket :2ticket : 1實驗現(xiàn)象分析:為了完成售票任務建立了兩個售票點作

6、為進程,線程售票點1開啟售某一張固定的票時,由于并發(fā)控制,售票點2也會檢測到該張票,導致兩個售票點賣出了同一張票, 這在實際操作中是不應該發(fā)生的問題,由此引發(fā)了第二種方案,對其采用臨界區(qū)加以控制操作系統(tǒng) 實驗七 學號:姓名:.針對上面兩個售票點shopl、shop2的售票活動,我們通過一個臨界區(qū)加以控制,使得售出的票不會有不符合實際的票號出現(xiàn)。建立兩個飛機售票點,兩個售票點并發(fā)賣票,但在賣票中加以控制(采用臨界區(qū)) 程序代碼如下:#include#includeDWORD WINAPI Shop1();DWORD WINAPI Shop2();int tickets=200; / 有200張飛

7、機票待售CRITICAL_SECTION g_cs;/聲明一個臨界區(qū)類的對象g_csint main() InitializeCriticalSection(&g_cs);/初始化臨界區(qū)對象,然后開啟兩個線程開始售票HANDLEhThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Shop1,NULL,0,NULL); HANDLEhThread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Shop2,NULL,0,NULL);/延時10000毫秒,然后再退出Sleep(10000);CloseH

8、andle(hThread1);CloseHandle(hThread2);/退出兩個售票進程,然后終止主線程Sleep(1000);DeleteCriticalSection(&g_cs);使用完臨界區(qū)對象之后,要將其銷毀return 0; /定義售票點1 DWORD WINAPI Shop1() while(1)EnterCriticalSection(&g_cs);每次賣票前都要先進入臨界區(qū)if(tickets0) Sleep(1); printf(Shop1 is selling a ticket:%dn.n,tickets); tickets-; LeaveCriticalSecti

9、on(&g_cs);/每次賣票后都要退出臨界區(qū) elseLeaveCriticalSection(&g_cs); 每次賣票后都要退出臨界區(qū) /定義售票點2 DWORD WINAPI Shop2() while(1) EnterCriticalSection(&g_cs); /每次賣票前都要先進入臨界區(qū)if(tickets0)操作系統(tǒng)實驗七 學號:姓名:Sleep(1);printf(Shop2 is selling a ticket:%dn.n,tickets); tickets-;LeaveCriticalSection(&g_cs); 每次賣票后都要退出臨界區(qū) elseLeaveCriti

10、calSection(&g_cs); 每次賣票后都要退出臨界區(qū) 實驗結果如下:實驗結果分析:由于實驗一的不正常售票,實驗二采用臨界區(qū)進行管理,相當于給每個要進入臨界區(qū)的進程進行加鎖和解鎖操作(初始狀態(tài)是打開的)。實驗模擬過程是當有進程正在運行中時,即鎖未開時,則必須等待,直至鎖被打開;反之,當鎖是打開時,則應該立即拔起鎖上,以阻止其他進程進入臨界區(qū)。保證了對鎖的測試和關鎖操作的連續(xù)性和完整性,有效地保證了兩個進程的互斥。四.實驗小結通過本次實驗,了解進程同步和互斥的兩種形式,使并發(fā)執(zhí)行的進程之間能夠按照一定的規(guī)則共享系統(tǒng)資源,并對臨界資源的互斥訪問進行學習和掌握其管理的規(guī)則,在實驗二中采用的就是臨界

溫馨提示

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

評論

0/150

提交評論