




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC6.0 做的實(shí)現(xiàn)線程同步的四種方法的詳細(xì)操作步驟 軟件作業(yè)一:如何實(shí)現(xiàn)線程同步? (二是一個(gè)基于單個(gè)文檔的 MFC 程序,參考的是某本書 上完整的一個(gè)可運(yùn)行實(shí)例,所用代碼和課件上幾乎相同,應(yīng)該會(huì)更符合老師上課講的思路) windows 系統(tǒng)提供的 4 種同步化機(jī)制分別為: 臨界區(qū) 信號(hào)量?jī)?nèi)核對(duì)象 事件內(nèi)核對(duì)象 互斥體對(duì)象 一:非 MFC 下實(shí)現(xiàn)線程同步實(shí)例 臨界區(qū):課本 P43、 44 / CriticalSection.cpp 文件 #include #include #include BOOL g_bContinue = TRUE; int g_nCount1 = 0; int g_n
2、Count2 = 0;CRITICAL_SECTION g_cs; / 對(duì)存在同步問題的代碼段使用臨界區(qū)對(duì)象UINT _stdcall ThreadFunc(LPVOID);int main(int argc, char* argv) UINT uId;HANDLE h2;/ 初始化臨界區(qū)對(duì)象:InitializeCriticalSection(&g_cs);h0 = (HANDLE):_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId); h1 = (HANDLE):_beginthreadex(NULL, 0, ThreadFunc, NUL
3、L, 0, &uId);/ 等待 1 秒后通知兩個(gè)計(jì)數(shù)線程結(jié)束,關(guān)閉句柄 Sleep(1000);g_bContinue = FALSE;:WaitForMultipleObjects(2, h, TRUE, INFINITE);:CloseHandle(h0);:CloseHandle(h1);/ 刪除臨界區(qū)對(duì)象:DeleteCriticalSection(&g_cs); printf(g_nCount1 = %d n, g_nCount1); printf(g_nCount2 = %d n, g_nCount2);return 0;UINT _stdcall ThreadFunc(LPVO
4、ID) while(g_bContinue):EnterCriticalSection(&g_cs);g_nCount1+;g_nCount2+;:LeaveCriticalSection(&g_cs);return 0;事件內(nèi)核對(duì)象:課本 P46 / EventDemo.cpp 文件 #include #include #include HANDLE g_hEvent;UINT _stdcall ChildFunc(LPVOID);int main(int argc, char* argv) HANDLE hChildThread;UINT uId;/創(chuàng)建一個(gè)自動(dòng)重置的(auto-reset
5、 even ts),未受信的(non sig naled)事件內(nèi)核對(duì)象 g_hEvent = :CreateEvent(NULL, FALSE, FALSE, NULL);hChildThread = (HANDLE):_beginthreadex(NULL, 0, ChildFunc, NULL, 0, &uId);/ 通知子線程開始工作printf(Please input a char to tell the Child Thread to work: n); getchar();:SetEvent(g_hEvent);/ 等待子線程完成工作,釋放資源:WaitForSingleObje
6、ct(hChildThread, INFINITE); printf(All the work has been finished. n); :CloseHandle(hChildThread); :CloseHandle(g_hEvent);return 0;UINT _stdcall ChildFunc(LPVOID) :WaitForSingleObject(g_hEvent, INFINITE); printf( Child thread is working n);:Sleep(5*1000); / 暫停 5 秒,模擬真正的工作 return 0;P38)設(shè)定優(yōu)先級(jí)實(shí)現(xiàn)三個(gè)線程的同步
7、(參見課本/ PriorityDemo.cpp 文件#include #include HANDLE hMutex = NULL;char g_cArray10;DWORD WINAPI ThreadProc1(LPVOID lpParam) WaitForSingleObject(hMutex,INFINITE);for(int i=0;i10;i+)g_cArrayi=a;printf(ThreadProc1 Normal Thread is runningn); printf(g_cArray%d = %cn,i,g_cArrayi);Sleep(1000);/sleep(1) 約為 1
8、5msReleaseMutex(hMutex);return 0;DWORD WINAPI ThreadProc2(LPVOID lpParam)WaitForSingleObject(hMutex,INFINITE);for(int i=0;i10;i+)g_cArray10-i-1=b;printf(ThreadProc2 Lowest Thread is runningn); printf(g_cArray%d = %cn,10-i-1,g_cArray10-i-1);Sleep(1000);ReleaseMutex(hMutex);return 0;DWORD WINAPI Threa
9、dProc3(LPVOID lpParam) WaitForSingleObject(hMutex,INFINITE);for(int i=0;i10;i+)g_cArrayi=c;printf(ThreadProc3 Idle Thread is runningn); printf(g_cArray%d = %cn,i,g_cArrayi); Sleep(1000);ReleaseMutex(hMutex);return 0;int main(int argc, char* argv)DWORD dwThreadID;HANDLE h3;/ 創(chuàng)建一個(gè)優(yōu)先級(jí)為 Normal 的線程h0 = :
10、CreateThread(NULL, 0, ThreadProc1, NULL, 0, &dwThreadID);/ 創(chuàng)建一個(gè)優(yōu)先級(jí)為 Lowest 的線程 h1 = :CreateThread(NULL, 0, ThreadProc2, NULL,CREATE_SUSPENDED, &dwThreadID); :SetThreadPriority(h1, THREAD_PRIORITY_LOWEST); :ResumeThread(h1);/ 創(chuàng)建一個(gè)優(yōu)先級(jí)為 Idle 的線程h2 = :CreateThread(NULL, 0, ThreadProc3, NULL,CREATE_SUSPE
11、NDED, &dwThreadID); :SetThreadPriority(h2, THREAD_PRIORITY_IDLE); :ResumeThread(h2);/等待兩個(gè)線程內(nèi)核對(duì)象都變成受信狀態(tài):WaitForMult ip leObjects(3,h,TRUE,INFINITE);:CloseHa ndle(h0);:CloseHa ndle(h1);:CloseHa ndle(h2);return 0;二:在MFC下實(shí)現(xiàn)線程同步實(shí)例(含四種方法)這是一個(gè)基于單個(gè)文檔的MFC程序(參考的是某本書上完整的一個(gè)實(shí)例,所用代碼和課件上幾乎相同)操作步驟:1、新建“ MFC APPWIZA
12、RD(EXE) ”,選擇文件路徑,輸入文件名2、選擇應(yīng)用程序類型為“ 單個(gè)文檔”3、添加“線程同步的四種方法”的各菜單項(xiàng),并在類向?qū)У囊曨愔刑砑痈鞑藛蜗⒑瘮?shù)ID號(hào)標(biāo)題消息函數(shù)IDC SYN CRITICALSECTION臨界區(qū)OnSyn Criticalsecti onIDC SYN EVENT事件內(nèi)核對(duì)象On Sy nEve ntIDC SYN MUTEX互斥內(nèi)核對(duì)象OnSynM utexIDC SYN SEMA PH ORE信號(hào)量?jī)?nèi)核對(duì)象OnSyn Sema phore添加菜單消息響應(yīng)函數(shù)的方法為:在 MFC ClassWizard (類向?qū)В┲械?CMyView視圖下選 中要添加消息響
13、應(yīng)函數(shù)的菜單的 ID號(hào),單擊右側(cè)的 Message中雙擊COMMAND,跳出函 數(shù)名,單擊OK即可mi iiJ嫌程同步四種方法:1爭(zhēng)件肉礦對(duì)象 互斥內(nèi)核對(duì)集信尋量?jī)?nèi)植對(duì)彖:LlUJI UBIlBtaaiM HI! BJIIBiajlll BJ J J4、 在實(shí)現(xiàn)線程同步的四種方法View.cpp ”文件開頭添加頭文件 #include afxmt.h5、 用“臨界區(qū)”實(shí)現(xiàn)線程同步,在“實(shí)現(xiàn)線程同步的四種方法View.cpP ”文件中添加相應(yīng) 代碼1)編寫線程函數(shù)char cArray10; / 共享資源CCriticalSection criticalSectio n;/ MFC 臨界區(qū)類對(duì)象
14、/臨界區(qū)線程函數(shù)UINT ThreadCriticalFunc1(LPVOID param) / 進(jìn)入臨界區(qū)criticalSection.Lock();/ 對(duì)共享資源進(jìn)行寫入操作 for (int i = 0; i 10; i+) cArrayi = a;Sleep(1);/ 離開臨界區(qū)criticalSection.Unlock();return 0;UINT ThreadCriticalFunc2(LPVOID param)/ 進(jìn)入臨界區(qū) criticalSection.Lock();/ 對(duì)共享資源進(jìn)行寫入操作 for (int i = 0; i 10; i+) cArray10 - i
15、 - 1 = b;Sleep(1);/ 離開臨界區(qū) criticalSection.Unlock(); return 0;2)在類視圖中選擇 OnSynCriticalsection() ,添加代碼 void CMyView:OnSynCriticalsection() / 臨界區(qū) / TODO: Add your command handler code here/ TODO: Add your command handler code here / 啟動(dòng)線程 AfxBeginThread(ThreadCriticalFunc1, NULL); AfxBeginThread(ThreadCr
16、iticalFunc2, NULL);/ 等待計(jì)算完畢 Sleep(300);/報(bào)告計(jì)算結(jié)果CStri ng sResult = CStri ng(cArray);AfxMessageBox(sResult); 3)運(yùn)行程序,單擊“臨界區(qū)”莊 無垢題-實(shí)現(xiàn)線程同歩聃四種方祛絨程同歩四種方法彈出出實(shí)現(xiàn)線程同歩的四種方法曲H黑髦 S製實(shí)現(xiàn)線程同步的0種方法岡View.cp P ”文件中添6、用“事件內(nèi)核對(duì)象”實(shí)現(xiàn)線程同步,在“實(shí)現(xiàn)線程同步的四種方法 加相應(yīng)代碼1)編寫線程函數(shù)/事件內(nèi)核對(duì)象CEvent event;UINT ThreadEve ntFu nc1(L PVOID param)/對(duì)共享
17、資源進(jìn)行寫入操作for (int i = 0; i 10; i+)cArrayi = a;Slee p(1);/設(shè)置事件置位eve nt.SetEve nt();return 0;UINT ThreadEve ntFu nc2(L PVOID param)/等待事件eve nt.Lock();/對(duì)共享資源進(jìn)行寫入操作for (int i = 0; i 10; i+)cArray10 - i - 1 = b;Slee p(1);2)return 0;在類視圖中選擇 OnSyn Eve nt (),添加代碼 void CMyView:OnSynEvent()/ 事件內(nèi)核對(duì)象 / TODO: Add
18、 your comma nd han dler code here / TODO: Add your comma nd han dler code here/啟動(dòng)線程AfxBegi nThread(ThreadEve ntFu nc1, NULL); AfxBegi nThread(ThreadEve ntFu nc2, NULL);/等待計(jì)算完畢Slee p(300);/報(bào)告計(jì)算結(jié)果CStri ng sResult = CStri ng(cArray); AfxMessageBox(sResult);3)運(yùn)行程序,單擊“事件內(nèi)核對(duì)象”,彈出卜兒1:中mD遼0,4 21劉韁案現(xiàn)蛭程同步的H種方
19、法區(qū)I廠”鏈rll TF * View.cpp ”文件中添7、用“互斥內(nèi)核對(duì)象”實(shí)現(xiàn)線程同步,在“實(shí)現(xiàn)線程同步的四種方法 加相應(yīng)代碼1)編寫線程函數(shù)/互斥CMutex mutex(FALSE, NULL); / 互斥類對(duì)象UINT ThreadMutexFunc1(LPVOID param) mutex.Lock();/ 等待互斥對(duì)象通知 / 對(duì)共享資源進(jìn)行寫入操作 for (int i = 0; i 10; i+)cArrayi = a;Sleep(1);mutex.Unlock();/ 釋放互斥對(duì)象 return 0;UINT ThreadMutexFunc2(LPVOID param)
20、mutex.Lock();/ 等待互斥對(duì)象通知 / 對(duì)共享資源進(jìn)行寫入操作 for (int i = 0; i 10; i+)cArray10 - i - 1 = b;Sleep(1);mutex.Unlock();/ 釋放互斥對(duì)象 return 0;2)在類視圖中選擇 OnSynMutex () ,添加代碼 void CMyView:OnSynMutex() / 互斥內(nèi)核對(duì)象 / TODO: Add your command handler code here/ TODO: Add your command handler code here / 啟動(dòng)線程AfxBeginThread(Thr
21、eadMutexFunc1, NULL);AfxBeginThread(ThreadMutexFunc2, NULL);/ 等待計(jì)算完畢 Sleep(300);/ 報(bào)告計(jì)算結(jié)果CStri ng sResult = CStri ng(cArray);AfxMessageBox(sResult);3)運(yùn)行程序,單擊“互斥內(nèi)核對(duì)象”,彈出View.cpp ”文丄8、用“信號(hào)量?jī)?nèi)核對(duì)象”實(shí)現(xiàn)線程同步,在“實(shí)現(xiàn)線程同步的四種方法 件中添加相應(yīng)代碼(這個(gè)最符合當(dāng)時(shí)老師布置的作業(yè)的要求)1)編寫線程函數(shù)信號(hào)量CSemaphore semaphore(2, 2);/ 信號(hào)量類對(duì)象UINT ThreadSema phoreFu nc1(L PVOID param)semaphore.Lock();/試圖進(jìn)入信號(hào)量關(guān)口AfxMessageBox(線程一正在執(zhí)行!);/線程任務(wù)處理sema
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- YY/T 1946-2024腫瘤組織基因突變檢測(cè)試劑盒(高通量測(cè)序法)
- 農(nóng)副產(chǎn)品購銷示范合同
- 簽訂的門面租賃合同條款解析
- 建筑項(xiàng)目施工合同管理人員聘用合同
- 炒股合作經(jīng)典合同案例
- 車輛采購合同細(xì)則
- 國(guó)際物流服務(wù)合同專業(yè)版詳解
- 農(nóng)村土地流轉(zhuǎn)授權(quán)合同書
- 城市房屋拆遷補(bǔ)償安置標(biāo)準(zhǔn)合同樣本
- 鋼材買賣合同(示范文本GF-0155)
- 骶髂關(guān)節(jié)損傷郭倩課件
- 內(nèi)科學(xué)疾病概要-支氣管擴(kuò)張課件
- 2025陜西渭南光明電力集團(tuán)限公司招聘39人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 預(yù)防感冒和流感的方法
- 2024年黑龍江職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年南京旅游職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 股指期貨基礎(chǔ)知識(shí)介紹培訓(xùn)課件
- 2024年北京東城社區(qū)工作者招聘筆試真題
- xx學(xué)校培訓(xùn)部工作職責(zé)
- T-GXAR 005-2024 制冷機(jī)房運(yùn)行維護(hù)規(guī)程
- 開工第一課安全培訓(xùn)總結(jié)精彩
評(píng)論
0/150
提交評(píng)論