版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 2016-2017學(xué)年度第一學(xué)期大作業(yè) 課程名稱(chēng): 操作系統(tǒng)(含課程設(shè)計(jì)) 任課教師: 解 曉 萌 作業(yè)題目: 創(chuàng)建線(xiàn)程,利用互斥實(shí)現(xiàn)線(xiàn)程共享變量通信 姓名: 魯 斌 學(xué) 號(hào): 201515572013002 專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 教學(xué)中心: 寶 安 學(xué) 文 聯(lián)系電話(huà): 評(píng)審日期_成績(jī)_評(píng)審教師(簽名)_華南理工大學(xué)網(wǎng)絡(luò)教育學(xué)院 “計(jì)算機(jī)操作系統(tǒng)”課程設(shè)計(jì)大作業(yè) 實(shí)驗(yàn)報(bào)告一、題目: 創(chuàng)建線(xiàn)程,利用互斥實(shí)現(xiàn)線(xiàn)程共享變量通信二、目的掌握線(xiàn)程創(chuàng)建和終止,加深對(duì)線(xiàn)程和進(jìn)程概念的理解,
2、會(huì)用同步與互斥方法實(shí)現(xiàn)線(xiàn)程之間的通信。三、概述:為了確保讀線(xiàn)程讀取到的是經(jīng)過(guò)修改的變量,必須在向變量寫(xiě)入數(shù)據(jù)時(shí)禁止其他線(xiàn)程對(duì)它的任何訪(fǎng)問(wèn),直至賦值過(guò)程結(jié)束后再解除對(duì)其他線(xiàn)程的訪(fǎng)問(wèn)限制。這保證了線(xiàn)程了解其他線(xiàn)程任務(wù)處理結(jié)束后的結(jié)果而采取的保護(hù)措施稱(chēng)為線(xiàn)程同步。從大的方面來(lái)講,線(xiàn)程的同步分為用戶(hù)模式的線(xiàn)程同步和內(nèi)核對(duì)象的線(xiàn)程同步。用戶(hù)模式中線(xiàn)程的同步方法有原子訪(fǎng)問(wèn)和臨界區(qū)等方法。它的特點(diǎn)是同步速度特別快,適合對(duì)線(xiàn)程運(yùn)行速度有嚴(yán)格要求的場(chǎng)合。內(nèi)核對(duì)象的線(xiàn)程同步由事件、等待定時(shí)器、信號(hào)量以及信號(hào)燈等內(nèi)核對(duì)象構(gòu)成。由于這同步機(jī)制使用了內(nèi)核對(duì)象,使用時(shí)一定要將線(xiàn)程從用戶(hù)模式切換到內(nèi)核模式,而這種轉(zhuǎn)換一般要
3、耗費(fèi)近千個(gè)CPU周期,所以同步速度較慢,但適用性卻要遠(yuǎn)優(yōu)于用戶(hù)模式的線(xiàn)程臨界區(qū)臨界區(qū)是一段獨(dú)占對(duì)某些共享資源訪(fǎng)問(wèn)的代碼,在任意時(shí)刻只允許一個(gè)線(xiàn)程對(duì)共享資源進(jìn)行訪(fǎng)問(wèn)。通過(guò)對(duì)多線(xiàn)程的串行化來(lái)訪(fǎng)問(wèn)公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪(fǎng)問(wèn)若有多個(gè)線(xiàn)程試圖同時(shí)訪(fǎng)問(wèn)臨界區(qū),那么在有一個(gè)線(xiàn)程進(jìn)入后其他所有試圖訪(fǎng)問(wèn)此臨界區(qū)的線(xiàn)程將被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線(xiàn)程離開(kāi)。臨界區(qū)在被釋放后,其他線(xiàn)程可繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。使用臨界區(qū)保持線(xiàn)程同步以下是通過(guò)一段代碼說(shuō)明了臨界區(qū)在保護(hù)多線(xiàn)程訪(fǎng)問(wèn)共享資源中的作用。通過(guò)兩個(gè)線(xiàn)程分別對(duì)全局變量g_cArray10進(jìn)行寫(xiě)入操作,用臨界區(qū)結(jié)構(gòu)對(duì)
4、象g_cs來(lái)保持線(xiàn)程的同步,并在開(kāi)啟線(xiàn)程前對(duì)它進(jìn)行初始化。為了使實(shí)驗(yàn)效果更明顯,體現(xiàn)出臨界區(qū)的作用,在線(xiàn)程函數(shù)對(duì)共享資源g_cArray10的寫(xiě)入時(shí),以Sleep()函數(shù)延遲1毫秒,令其他線(xiàn)程同它搶占CPU的可能性加大。若不用臨界區(qū)對(duì)它進(jìn)行保護(hù),則共享資源數(shù)據(jù)將被破壞,但使用臨界區(qū)對(duì)線(xiàn)程保持同步后就可得到正確的結(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)行寫(xiě)入操
5、作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 離開(kāi)臨界區(qū)LeaveCriticalSection(&g_cs);return 0;UINT ThreadProc11(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫(xiě)入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 離開(kāi)臨界區(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)行寫(xiě)入操作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 離開(kāi)臨界區(qū)LeaveCriticalSection(&g_cs);return 0;UINT ThreadProc11(LPVOID pParam)/ 進(jìn)入臨界
7、區(qū)EnterCriticalSection(&g_cs);/ 對(duì)共享資源進(jìn)行寫(xiě)入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 離開(kāi)臨界區(qū)LeaveCriticalSection(&g_cs);return 0;void CSample08View:OnCriticalSection()/ 初始化臨界區(qū)InitializeCriticalSection(&g_cs);/ 啟動(dòng)線(xiàn)程AfxBeginThread(ThreadProc10, NULL);AfxBeginThr
8、ead(ThreadProc11, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);信號(hào)量?jī)?nèi)核對(duì)象信號(hào)量?jī)?nèi)核,允許多個(gè)線(xiàn)程在同一時(shí)刻訪(fǎng)問(wèn)同一資源,但需限制在同一時(shí)刻訪(fǎng)問(wèn)此資源的最大線(xiàn)程數(shù)目。在用CreateSemaphore()創(chuàng)建信號(hào)量時(shí)應(yīng)要同時(shí)指出允許的最大資源計(jì)數(shù)和當(dāng)前可用資源計(jì)數(shù)。一般將當(dāng)前可用資源計(jì)數(shù)設(shè)為最大資源計(jì)數(shù),每增一個(gè)線(xiàn)程對(duì)共享資源的訪(fǎng)問(wèn),當(dāng)前可用資源計(jì)數(shù)就減1,只要當(dāng)前可用資源計(jì)數(shù)大于0的,就可發(fā)出信號(hào)量信號(hào)。但當(dāng)前可用計(jì)數(shù)減小到0時(shí)則說(shuō)明
9、當(dāng)前占用資源的線(xiàn)程數(shù)已達(dá)到了所允許的最大數(shù)目,不能在允許其他線(xiàn)程的進(jìn)入,這時(shí)的信號(hào)量信號(hào)將無(wú)法發(fā)出。線(xiàn)程在處理完共享資源后,應(yīng)在離開(kāi)的同時(shí)通過(guò)ReleaseSemaphore()函數(shù)將當(dāng)前可用資源計(jì)數(shù)加1。在任何時(shí)候當(dāng)前可用資源計(jì)數(shù)決不能大于最大資源計(jì)數(shù)。使用信號(hào)量?jī)?nèi)核對(duì)象進(jìn)行線(xiàn)程同步主要會(huì)用到OpenSemaphore()、ReleaseSemaphore()、 CreateSemaphore()、WaitForMultipleObjects()和WaitForSingleObject()等函數(shù)。其中,CreateSemaphore()是用來(lái)創(chuàng)建一個(gè)信號(hào)量?jī)?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ù),最大取值不超過(guò)4294967295。lpName參數(shù)可為創(chuàng)建的信號(hào)量定義一個(gè)名字,由于其創(chuàng)建的是一個(gè)內(nèi)核對(duì)象,所以在其他進(jìn)程中可通過(guò)該名字而得到此信號(hào)量。OpenSemaphore()函數(shù)即可用來(lái)根據(jù)信號(hào)量名打開(kāi)在其他進(jìn)程中創(chuàng)建的
11、信號(hào)量,函數(shù)原型如下:HANDLE OpenSemaphore(DWORD dwDesiredAccess, / 訪(fǎng)問(wèn)標(biāo)志BOOL bInheritHandle, / 繼承標(biāo)志LPCTSTR lpName / 信號(hào)量名);在線(xiàn)程離開(kāi)對(duì)共享資源的處理時(shí),一定要通過(guò)ReleaseSemaphore()來(lái)增加當(dāng)前可用資源計(jì)數(shù)。否則將會(huì)導(dǎo)致當(dāng)前正在處理共享資源的實(shí)際線(xiàn)程數(shù)并不能達(dá)到要限制的數(shù)值,而其他線(xiàn)程卻因?yàn)楫?dāng)前可用資源計(jì)數(shù)為0但仍無(wú)法進(jìn)入的情況。ReleaseSemaphore()的函數(shù)原型為:BOOL ReleaseSemaphore(HANDLE hSemaphore, / 信號(hào)量句柄LONG
12、 lReleaseCount, / 計(jì)數(shù)遞增數(shù)量LPLONG lpPreviousCount / 先前計(jì)數(shù));互斥是用途廣泛的內(nèi)核對(duì)象。能保證多個(gè)線(xiàn)程對(duì)同一共享資源的互斥訪(fǎng)問(wèn)。只有擁有互斥對(duì)象的線(xiàn)程才具有訪(fǎng)問(wèn)資源的權(quán)限,由于互斥對(duì)象只有一個(gè),所以就決定了無(wú)論在什么情況下,這共享資源都不會(huì)同時(shí)被多個(gè)線(xiàn)程所訪(fǎng)問(wèn)。當(dāng)前占據(jù)資源的線(xiàn)程在任務(wù)處理完后應(yīng)將擁有的互斥對(duì)象交出,便于其他線(xiàn)程在獲得后得以訪(fǎng)問(wèn)資源?;コ鈱?duì)象在操作系統(tǒng)中擁有特殊代碼,并由操作系統(tǒng)來(lái)管理,操作系統(tǒng)甚至還允許它進(jìn)行一些其他內(nèi)核對(duì)象不能進(jìn)行的非常規(guī)操作。為了便于理解,可參照互斥內(nèi)核用互斥內(nèi)核對(duì)象來(lái)保持線(xiàn)程同步可能用到的函數(shù)有OpenMu
13、tex()、ReleaseMutex()、CreateMutex()、WaitForSingleObject()和WaitForMultipleObjects()等。在使用互斥對(duì)象前,首先要通過(guò)CreateMutex()或OpenMutex()創(chuàng)建或打開(kāi)一個(gè)互斥對(duì)象。CreateMutex()函數(shù)原型為:/ 互斥對(duì)象HANDLE hMutex = NULL;har g_cArray10;UINT ThreadProc18(LPVOID pParam)/ 等待互斥對(duì)象通知WaitForSingleObject(hMutex, INFINITE);/ 對(duì)共享資源進(jìn)行寫(xiě)入操作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)行寫(xiě)入操作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)線(xiàn)程AfxBeginThread(ThreadProc18, NULL);AfxBeginThread(ThreadProc19, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);/ MFC互斥類(lèi)對(duì)象CMutex g_clsMutex(FALSE, NULL);UINT ThreadProc27(LPVOID pPara
16、m)/ 等待互斥對(duì)象通知g_clsMutex.Lock();/ 對(duì)共享資源進(jìn)行寫(xiě)入操作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)行寫(xiě)入操作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)線(xiàn)程AfxBeginThread(ThreadProc27, NULL);AfxBeginThread(ThreadProc28, NULL);/ 等待計(jì)算完畢Sleep(300);/ 報(bào)告計(jì)算結(jié)果CString sResult =
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版油氣田鉆井技術(shù)服務(wù)質(zhì)量承包合同3篇
- 2025年度環(huán)保型廠(chǎng)房設(shè)計(jì)與施工總承包合同3篇
- 二零二四年在線(xiàn)教育平臺(tái)軟件全國(guó)代理銷(xiāo)售合同模板2篇
- 2025年度全國(guó)范圍內(nèi)土地測(cè)繪技術(shù)服務(wù)合同范文3篇
- 2024版液化天然氣交易協(xié)議全文下載版B版
- 2024版運(yùn)輸行業(yè)職員勞動(dòng)協(xié)議樣本
- 2024年地基買(mǎi)賣(mài)合同附帶地基檢測(cè)及質(zhì)量認(rèn)證3篇
- 2025年大棚農(nóng)業(yè)綠色生產(chǎn)技術(shù)引進(jìn)合同3篇
- 2025年度綠色建筑:知識(shí)產(chǎn)權(quán)許可與環(huán)保建材合同3篇
- 2025年智慧能源物業(yè)工程承包及節(jié)能服務(wù)合同3篇
- 2024版塑料購(gòu)銷(xiāo)合同范本買(mǎi)賣(mài)
- 【高一上】【期末話(huà)收獲 家校話(huà)未來(lái)】期末家長(zhǎng)會(huì)
- JJF 2184-2025電子計(jì)價(jià)秤型式評(píng)價(jià)大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 有毒有害氣體崗位操作規(guī)程(3篇)
- 兒童常見(jiàn)呼吸系統(tǒng)疾病免疫調(diào)節(jié)劑合理使用專(zhuān)家共識(shí)2024(全文)
- 2025屆山東省德州市物理高三第一學(xué)期期末調(diào)研模擬試題含解析
- 《華潤(rùn)集團(tuán)全面預(yù)算管理案例研究》
- 二年級(jí)下冊(cè)加減混合豎式練習(xí)360題附答案
- 異地就醫(yī)備案?jìng)€(gè)人承諾書(shū)
- 蘇教版五年級(jí)數(shù)學(xué)下冊(cè)解方程五種類(lèi)型50題
評(píng)論
0/150
提交評(píng)論