操作系統(tǒng)-創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信_第1頁
操作系統(tǒng)-創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信_第2頁
操作系統(tǒng)-創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信_第3頁
操作系統(tǒng)-創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信_第4頁
操作系統(tǒng)-創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 2016-2017學(xué)年度第一學(xué)期大作業(yè)  課程名稱: 操作系統(tǒng)(含課程設(shè)計) 任課教師: 解 曉 萌 作業(yè)題目: 創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信 姓名: 魯 斌 學(xué) 號: 201515572013002 專 業(yè): 計算機(jī)科學(xué)與技術(shù) 教學(xué)中心: 寶 安 學(xué) 文 聯(lián)系電話:        評審日期_成績_評審教師(簽名)_華南理工大學(xué)網(wǎng)絡(luò)教育學(xué)院 “計算機(jī)操作系統(tǒng)”課程設(shè)計大作業(yè) 實驗報告一、題目: 創(chuàng)建線程,利用互斥實現(xiàn)線程共享變量通信二、目的掌握線程創(chuàng)建和終止,加深對線程和進(jìn)程概念的理解,

2、會用同步與互斥方法實現(xiàn)線程之間的通信。三、概述:為了確保讀線程讀取到的是經(jīng)過修改的變量,必須在向變量寫入數(shù)據(jù)時禁止其他線程對它的任何訪問,直至賦值過程結(jié)束后再解除對其他線程的訪問限制。這保證了線程了解其他線程任務(wù)處理結(jié)束后的結(jié)果而采取的保護(hù)措施稱為線程同步。從大的方面來講,線程的同步分為用戶模式的線程同步和內(nèi)核對象的線程同步。用戶模式中線程的同步方法有原子訪問和臨界區(qū)等方法。它的特點是同步速度特別快,適合對線程運(yùn)行速度有嚴(yán)格要求的場合。內(nèi)核對象的線程同步由事件、等待定時器、信號量以及信號燈等內(nèi)核對象構(gòu)成。由于這同步機(jī)制使用了內(nèi)核對象,使用時一定要將線程從用戶模式切換到內(nèi)核模式,而這種轉(zhuǎn)換一般要

3、耗費近千個CPU周期,所以同步速度較慢,但適用性卻要遠(yuǎn)優(yōu)于用戶模式的線程臨界區(qū)臨界區(qū)是一段獨占對某些共享資源訪問的代碼,在任意時刻只允許一個線程對共享資源進(jìn)行訪問。通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問若有多個線程試圖同時訪問臨界區(qū),那么在有一個線程進(jìn)入后其他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線程離開。臨界區(qū)在被釋放后,其他線程可繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。使用臨界區(qū)保持線程同步以下是通過一段代碼說明了臨界區(qū)在保護(hù)多線程訪問共享資源中的作用。通過兩個線程分別對全局變量g_cArray10進(jìn)行寫入操作,用臨界區(qū)結(jié)構(gòu)對

4、象g_cs來保持線程的同步,并在開啟線程前對它進(jìn)行初始化。為了使實驗效果更明顯,體現(xiàn)出臨界區(qū)的作用,在線程函數(shù)對共享資源g_cArray10的寫入時,以Sleep()函數(shù)延遲1毫秒,令其他線程同它搶占CPU的可能性加大。若不用臨界區(qū)對它進(jìn)行保護(hù),則共享資源數(shù)據(jù)將被破壞,但使用臨界區(qū)對線程保持同步后就可得到正確的結(jié)果。代碼如下:/ 臨界區(qū)結(jié)構(gòu)對象CRITICAL_SECTION g_cs;/ 共享資源char g_cArray10;UINT ThreadProc10(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對共享資源進(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);/ 對共享資源進(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)對象CRITICAL_SECTION g_cs;/ 共享資源 char g_cArray10;UINT ThreadProc10(LPVOID pParam)/ 進(jìn)入臨界區(qū)EnterCriticalSection(&g_cs);/ 對共享資源進(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);/ 對共享資源進(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);/ 啟動線程AfxBeginThread(ThreadProc10, NULL);AfxBeginThr

8、ead(ThreadProc11, NULL);/ 等待計算完畢Sleep(300);/ 報告計算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);信號量內(nèi)核對象信號量內(nèi)核,允許多個線程在同一時刻訪問同一資源,但需限制在同一時刻訪問此資源的最大線程數(shù)目。在用CreateSemaphore()創(chuàng)建信號量時應(yīng)要同時指出允許的最大資源計數(shù)和當(dāng)前可用資源計數(shù)。一般將當(dāng)前可用資源計數(shù)設(shè)為最大資源計數(shù),每增一個線程對共享資源的訪問,當(dāng)前可用資源計數(shù)就減1,只要當(dāng)前可用資源計數(shù)大于0的,就可發(fā)出信號量信號。但當(dāng)前可用計數(shù)減小到0時則說明

9、當(dāng)前占用資源的線程數(shù)已達(dá)到了所允許的最大數(shù)目,不能在允許其他線程的進(jìn)入,這時的信號量信號將無法發(fā)出。線程在處理完共享資源后,應(yīng)在離開的同時通過ReleaseSemaphore()函數(shù)將當(dāng)前可用資源計數(shù)加1。在任何時候當(dāng)前可用資源計數(shù)決不能大于最大資源計數(shù)。使用信號量內(nèi)核對象進(jìn)行線程同步主要會用到OpenSemaphore()、ReleaseSemaphore()、 CreateSemaphore()、WaitForMultipleObjects()和WaitForSingleObject()等函數(shù)。其中,CreateSemaphore()是用來創(chuàng)建一個信號量內(nèi)核對象,其函數(shù)原型為:HANDLE

10、 CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, / 安全屬性指針LONG lInitialCount, / 初始計數(shù)LONG lMaximumCount, / 最大計數(shù)LPCTSTR lpName / 對象名指針);參數(shù)lMaximumCount是一個有符號32位值,定義了允許的最大資源計數(shù),最大取值不超過4294967295。lpName參數(shù)可為創(chuàng)建的信號量定義一個名字,由于其創(chuàng)建的是一個內(nèi)核對象,所以在其他進(jìn)程中可通過該名字而得到此信號量。OpenSemaphore()函數(shù)即可用來根據(jù)信號量名打開在其他進(jìn)程中創(chuàng)建的

11、信號量,函數(shù)原型如下:HANDLE OpenSemaphore(DWORD dwDesiredAccess, / 訪問標(biāo)志BOOL bInheritHandle, / 繼承標(biāo)志LPCTSTR lpName / 信號量名);在線程離開對共享資源的處理時,一定要通過ReleaseSemaphore()來增加當(dāng)前可用資源計數(shù)。否則將會導(dǎo)致當(dāng)前正在處理共享資源的實際線程數(shù)并不能達(dá)到要限制的數(shù)值,而其他線程卻因為當(dāng)前可用資源計數(shù)為0但仍無法進(jìn)入的情況。ReleaseSemaphore()的函數(shù)原型為:BOOL ReleaseSemaphore(HANDLE hSemaphore, / 信號量句柄LONG

12、 lReleaseCount, / 計數(shù)遞增數(shù)量LPLONG lpPreviousCount / 先前計數(shù));互斥是用途廣泛的內(nèi)核對象。能保證多個線程對同一共享資源的互斥訪問。只有擁有互斥對象的線程才具有訪問資源的權(quán)限,由于互斥對象只有一個,所以就決定了無論在什么情況下,這共享資源都不會同時被多個線程所訪問。當(dāng)前占據(jù)資源的線程在任務(wù)處理完后應(yīng)將擁有的互斥對象交出,便于其他線程在獲得后得以訪問資源。互斥對象在操作系統(tǒng)中擁有特殊代碼,并由操作系統(tǒng)來管理,操作系統(tǒng)甚至還允許它進(jìn)行一些其他內(nèi)核對象不能進(jìn)行的非常規(guī)操作。為了便于理解,可參照互斥內(nèi)核用互斥內(nèi)核對象來保持線程同步可能用到的函數(shù)有OpenMu

13、tex()、ReleaseMutex()、CreateMutex()、WaitForSingleObject()和WaitForMultipleObjects()等。在使用互斥對象前,首先要通過CreateMutex()或OpenMutex()創(chuàng)建或打開一個互斥對象。CreateMutex()函數(shù)原型為:/ 互斥對象HANDLE hMutex = NULL;har g_cArray10;UINT ThreadProc18(LPVOID pParam)/ 等待互斥對象通知WaitForSingleObject(hMutex, INFINITE);/ 對共享資源進(jìn)行寫入操作for (int i =

14、 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 釋放互斥對象ReleaseMutex(hMutex);return 0;UINT ThreadProc19(LPVOID pParam)/ 等待互斥對象通知WaitForSingleObject(hMutex, INFINITE);/ 對共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 釋放互斥對象ReleaseMutex(hMutex);return 0;void CSamp

15、le08View:OnMutex() / 創(chuàng)建互斥對象hMutex = CreateMutex(NULL, FALSE, NULL);/ 啟動線程AfxBeginThread(ThreadProc18, NULL);AfxBeginThread(ThreadProc19, NULL);/ 等待計算完畢Sleep(300);/ 報告計算結(jié)果CString sResult = CString(g_cArray);AfxMessageBox(sResult);/ MFC互斥類對象CMutex g_clsMutex(FALSE, NULL);UINT ThreadProc27(LPVOID pPara

16、m)/ 等待互斥對象通知g_clsMutex.Lock();/ 對共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArrayi = 'a'Sleep(1);/ 釋放互斥對象g_clsMutex.Unlock();return 0;UINT ThreadProc28(LPVOID pParam)/ 等待互斥對象通知g_clsMutex.Lock();/ 對共享資源進(jìn)行寫入操作for (int i = 0; i < 10; i+)g_cArray10 - i - 1 = 'b'Sleep(1);/ 釋放互斥對象g_clsMutex.Unlock();return 0;void CSample08View:OnMutexMfc()/ 啟動線程AfxBeginThread(ThreadProc27, NULL);AfxBeginThread(ThreadProc28, NULL);/ 等待計算完畢Sleep(300);/ 報告計算結(jié)果CString sResult =

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論