![操作系統(tǒng)-創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信_(tái)第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/14/b599dc8c-499a-45e8-b6d9-2e38a6758898/b599dc8c-499a-45e8-b6d9-2e38a67588981.gif)
![操作系統(tǒng)-創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信_(tái)第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/14/b599dc8c-499a-45e8-b6d9-2e38a6758898/b599dc8c-499a-45e8-b6d9-2e38a67588982.gif)
![操作系統(tǒng)-創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信_(tái)第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/14/b599dc8c-499a-45e8-b6d9-2e38a6758898/b599dc8c-499a-45e8-b6d9-2e38a67588983.gif)
![操作系統(tǒng)-創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信_(tái)第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/14/b599dc8c-499a-45e8-b6d9-2e38a6758898/b599dc8c-499a-45e8-b6d9-2e38a67588984.gif)
![操作系統(tǒng)-創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信_(tái)第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/14/b599dc8c-499a-45e8-b6d9-2e38a6758898/b599dc8c-499a-45e8-b6d9-2e38a67588985.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 2016-2017學(xué)年度第一學(xué)期大作業(yè) 課程名稱: 操作系統(tǒng)(含課程設(shè)計(jì)) 任課教師: 解 曉 萌 作業(yè)題目: 創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信 姓名: 魯 斌 學(xué) 號(hào): 201515572013002 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 教學(xué)中心: 寶 安 學(xué) 文 聯(lián)系電話: 評(píng)審日期_成績_評(píng)審教師(簽名)_華南理工大學(xué)網(wǎng)絡(luò)教育學(xué)院 “計(jì)算機(jī)操作系統(tǒng)”課程設(shè)計(jì)大作業(yè) 實(shí)驗(yàn)報(bào)告一、題目: 創(chuàng)建線程,利用互斥實(shí)現(xiàn)線程共享變量通信二、目的掌握線程創(chuàng)建和終止,加深對(duì)線程和進(jìn)程概念的理解,
2、會(huì)用同步與互斥方法實(shí)現(xiàn)線程之間的通信。三、概述:為了確保讀線程讀取到的是經(jīng)過修改的變量,必須在向變量寫入數(shù)據(jù)時(shí)禁止其他線程對(duì)它的任何訪問,直至賦值過程結(jié)束后再解除對(duì)其他線程的訪問限制。這保證了線程了解其他線程任務(wù)處理結(jié)束后的結(jié)果而采取的保護(hù)措施稱為線程同步。從大的方面來講,線程的同步分為用戶模式的線程同步和內(nèi)核對(duì)象的線程同步。用戶模式中線程的同步方法有原子訪問和臨界區(qū)等方法。它的特點(diǎn)是同步速度特別快,適合對(duì)線程運(yùn)行速度有嚴(yán)格要求的場合。內(nèi)核對(duì)象的線程同步由事件、等待定時(shí)器、信號(hào)量以及信號(hào)燈等內(nèi)核對(duì)象構(gòu)成。由于這同步機(jī)制使用了內(nèi)核對(duì)象,使用時(shí)一定要將線程從用戶模式切換到內(nèi)核模式,而這種轉(zhuǎn)換一般要
3、耗費(fèi)近千個(gè)CPU周期,所以同步速度較慢,但適用性卻要遠(yuǎn)優(yōu)于用戶模式的線程臨界區(qū)臨界區(qū)是一段獨(dú)占對(duì)某些共享資源訪問的代碼,在任意時(shí)刻只允許一個(gè)線程對(duì)共享資源進(jìn)行訪問。通過對(duì)多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問若有多個(gè)線程試圖同時(shí)訪問臨界區(qū),那么在有一個(gè)線程進(jìn)入后其他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線程離開。臨界區(qū)在被釋放后,其他線程可繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。使用臨界區(qū)保持線程同步以下是通過一段代碼說明了臨界區(qū)在保護(hù)多線程訪問共享資源中的作用。通過兩個(gè)線程分別對(duì)全局變量g_cArray10進(jìn)行寫入操作,用臨界區(qū)結(jié)構(gòu)對(duì)
4、象g_cs來保持線程的同步,并在開啟線程前對(duì)它進(jìn)行初始化。為了使實(shí)驗(yàn)效果更明顯,體現(xiàn)出臨界區(qū)的作用,在線程函數(shù)對(duì)共享資源g_cArray10的寫入時(shí),以Sleep()函數(shù)延遲1毫秒,令其他線程同它搶占CPU的可能性加大。若不用臨界區(qū)對(duì)它進(jìn)行保護(hù),則共享資源數(shù)據(jù)將被破壞,但使用臨界區(qū)對(duì)線程保持同步后就可得到正確的結(jié)果。代碼如下:/ 臨界區(qū)結(jié)構(gòu)對(duì)象CRITICAL_SECTION g_cs;/ 共享資源char g_cArray10;UINT ThreadProc10(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫入操
5、作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 離開臨界區(qū)LeaveCriticalSection(&g_cs);return 0;UINT ThreadProc11(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 離開臨界區(qū)LeaveCriticalSection(&g
6、_cs);return 0;/ 臨界區(qū)結(jié)構(gòu)對(duì)象CRITICAL_SECTION g_cs;/ 共享資源 char g_cArray10;UINT ThreadProc10(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 離開臨界區(qū)LeaveCriticalSection(&g_cs);return 0;UINT ThreadProc11(LPVOID pParam)/ 進(jìn)入臨界
7、區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 離開臨界區(qū)LeaveCriticalSection(&g_cs);return 0;void CSample08View:OnCriticalSection()/ 初始化臨界區(qū)InitializeCriticalSection(&g_cs);/ 啟動(dòng)線程AfxBeginThread(ThreadProc10, NULL);AfxBeginThr
8、ead(ThreadProc11, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);信號(hào)量內(nèi)核對(duì)象信號(hào)量內(nèi)核,允許多個(gè)線程在同一時(shí)刻訪問同一資源,但需限制在同一時(shí)刻訪問此資源的最大線程數(shù)目。在用CreateSemaphore()創(chuàng)建信號(hào)量時(shí)應(yīng)要同時(shí)指出允許的最大資源計(jì)數(shù)和當(dāng)前可用資源計(jì)數(shù)。一般將當(dāng)前可用資源計(jì)數(shù)設(shè)為最大資源計(jì)數(shù),每增一個(gè)線程對(duì)共享資源的訪問,當(dāng)前可用資源計(jì)數(shù)就減1,只要當(dāng)前可用資源計(jì)數(shù)大于0的,就可發(fā)出信號(hào)量信號(hào)。但當(dāng)前可用計(jì)數(shù)減小到0時(shí)則說明
9、當(dāng)前占用資源的線程數(shù)已達(dá)到了所允許的最大數(shù)目,不能在允許其他線程的進(jìn)入,這時(shí)的信號(hào)量信號(hào)將無法發(fā)出。線程在處理完共享資源后,應(yīng)在離開的同時(shí)通過ReleaseSemaphore()函數(shù)將當(dāng)前可用資源計(jì)數(shù)加1。在任何時(shí)候當(dāng)前可用資源計(jì)數(shù)決不能大于最大資源計(jì)數(shù)。使用信號(hào)量內(nèi)核對(duì)象進(jìn)行線程同步主要會(huì)用到OpenSemaphore()、ReleaseSemaphore()、 CreateSemaphore()、WaitForMultipleObjects()和WaitForSingleObject()等函數(shù)。其中,CreateSemaphore()是用來創(chuàng)建一個(gè)信號(hào)量內(nèi)核對(duì)象,其函數(shù)原型為:HANDLE
10、 CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, / 安全屬性指針LONG lInitialCount, / 初始計(jì)數(shù)LONG lMaximumCount, / 最大計(jì)數(shù)LPCTSTR lpName / 對(duì)象名指針);參數(shù)lMaximumCount是一個(gè)有符號(hào)32位值,定義了允許的最大資源計(jì)數(shù),最大取值不超過4294967295。lpName參數(shù)可為創(chuàng)建的信號(hào)量定義一個(gè)名字,由于其創(chuàng)建的是一個(gè)內(nèi)核對(duì)象,所以在其他進(jìn)程中可通過該名字而得到此信號(hào)量。OpenSemaphore()函數(shù)即可用來根據(jù)信號(hào)量名打開在其他進(jìn)程中創(chuàng)建的
11、信號(hào)量,函數(shù)原型如下:HANDLE OpenSemaphore(DWORD dwDesiredAccess, / 訪問標(biāo)志BOOL bInheritHandle, / 繼承標(biāo)志LPCTSTR lpName / 信號(hào)量名);在線程離開對(duì)共享資源的處理時(shí),一定要通過ReleaseSemaphore()來增加當(dāng)前可用資源計(jì)數(shù)。否則將會(huì)導(dǎo)致當(dāng)前正在處理共享資源的實(shí)際線程數(shù)并不能達(dá)到要限制的數(shù)值,而其他線程卻因?yàn)楫?dāng)前可用資源計(jì)數(shù)為0但仍無法進(jìn)入的情況。ReleaseSemaphore()的函數(shù)原型為:BOOL ReleaseSemaphore(HANDLE hSemaphore, / 信號(hào)量句柄LONG
12、 lReleaseCount, / 計(jì)數(shù)遞增數(shù)量LPLONG lpPreviousCount / 先前計(jì)數(shù));互斥是用途廣泛的內(nèi)核對(duì)象。能保證多個(gè)線程對(duì)同一共享資源的互斥訪問。只有擁有互斥對(duì)象的線程才具有訪問資源的權(quán)限,由于互斥對(duì)象只有一個(gè),所以就決定了無論在什么情況下,這共享資源都不會(huì)同時(shí)被多個(gè)線程所訪問。當(dāng)前占據(jù)資源的線程在任務(wù)處理完后應(yīng)將擁有的互斥對(duì)象交出,便于其他線程在獲得后得以訪問資源?;コ鈱?duì)象在操作系統(tǒng)中擁有特殊代碼,并由操作系統(tǒng)來管理,操作系統(tǒng)甚至還允許它進(jìn)行一些其他內(nèi)核對(duì)象不能進(jìn)行的非常規(guī)操作。為了便于理解,可參照互斥內(nèi)核用互斥內(nèi)核對(duì)象來保持線程同步可能用到的函數(shù)有OpenMu
13、tex()、ReleaseMutex()、CreateMutex()、WaitForSingleObject()和WaitForMultipleObjects()等。在使用互斥對(duì)象前,首先要通過CreateMutex()或OpenMutex()創(chuàng)建或打開一個(gè)互斥對(duì)象。CreateMutex()函數(shù)原型為:/ 互斥對(duì)象HANDLE hMutex = NULL;har g_cArray10;UINT ThreadProc18(LPVOID pParam)/ 等待互斥對(duì)象通知WaitForSingleObject(hMutex, INFINITE);/ 對(duì)共享資源進(jìn)行寫入操作for (int i =
14、 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 釋放互斥對(duì)象ReleaseMutex(hMutex);return 0;UINT ThreadProc19(LPVOID pParam)/ 等待互斥對(duì)象通知WaitForSingleObject(hMutex, INFINITE);/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 釋放互斥對(duì)象ReleaseMutex(hMutex);return 0;void CSamp
15、le08View:OnMutex() / 創(chuàng)建互斥對(duì)象hMutex = CreateMutex(NULL, FALSE, NULL);/ 啟動(dòng)線程AfxBeginThread(ThreadProc18, NULL);AfxBeginThread(ThreadProc19, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);/ MFC互斥類對(duì)象CMutex g_clsMutex(FALSE, NULL);UINT ThreadProc27(LPVOID pPara
16、m)/ 等待互斥對(duì)象通知g_clsMutex.Lock();/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 釋放互斥對(duì)象g_clsMutex.Unlock();return 0;UINT ThreadProc28(LPVOID pParam)/ 等待互斥對(duì)象通知g_clsMutex.Lock();/ 對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 釋放互斥對(duì)象g_clsMutex.Unlock();return 0;void CSample08View:OnMutexMfc()/ 啟動(dòng)線程AfxBeginThread(ThreadProc27, NULL);AfxBeginThread(ThreadProc28, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度創(chuàng)新辦公園區(qū)草坪設(shè)計(jì)與生態(tài)友好合同
- 三農(nóng)村土地綜合整治指南
- 家具購銷合同協(xié)議書
- 知識(shí)產(chǎn)權(quán)與法務(wù)管理作業(yè)指導(dǎo)書
- 儀器儀表與自動(dòng)化設(shè)備行業(yè)作業(yè)指導(dǎo)書
- 游戲策劃設(shè)計(jì)作業(yè)指導(dǎo)書
- 醫(yī)美股份轉(zhuǎn)讓協(xié)議合同
- 藕塘承包合同樣本
- 地質(zhì)勘察合同付款條件
- 2025年雅安貨車叢業(yè)資格證考試題
- 服裝廠安全生產(chǎn)培訓(xùn)
- 城市隧道工程施工質(zhì)量驗(yàn)收規(guī)范
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024年參考題庫含答案解析
- 五 100以內(nèi)的筆算加、減法2.筆算減法 第1課時(shí) 筆算減法課件2024-2025人教版一年級(jí)數(shù)學(xué)下冊(cè)
- 2025年八省聯(lián)考陜西高考生物試卷真題答案詳解(精校打印)
- 2025脫貧攻堅(jiān)工作計(jì)劃
- 2022年四川省成都市成華區(qū)七年級(jí)下學(xué)期期末語文試卷
- 石油化工、煤化工、天然氣化工優(yōu)劣勢分析
- 10kV配網(wǎng)工程變配電(臺(tái)架變、箱變、電纜分接箱)的安裝設(shè)計(jì)施工精細(xì)化標(biāo)準(zhǔn)
- Q∕GDW 12118.3-2021 人工智能平臺(tái)架構(gòu)及技術(shù)要求 第3部分:樣本庫格式
- 廣東省義務(wù)教育階段學(xué)生轉(zhuǎn)學(xué)轉(zhuǎn)出申請(qǐng)表(樣本)
評(píng)論
0/150
提交評(píng)論