資源描述:
《windows線程同步與互斥》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實驗4Windows線程同步和互斥實驗?zāi)康?、了解Windows內(nèi)核對線程同步的支持。2、了解C的線程函數(shù)庫及Windows基本的線程API函數(shù)的使用。3、進一步理解線程的同步控制原理。預(yù)備知識一、Windows線程同步機制(注:互斥是同步的一種特例)n事件(Event)n臨界區(qū)(CriticalSection)n互斥量(Mutex)n信號量(Semaphore)1、是否能跨進城使用?互斥量、信號量、事件都可以跨進程來實現(xiàn)同步數(shù)據(jù)操作。臨界區(qū)只能用在同一進城的線程間互斥,因為臨界區(qū)無名(無句柄)。如果只為了在進程內(nèi)部用的話,使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量。2、
2、其它區(qū)別臨界區(qū):訪問臨界資源的代碼段。課堂上講過。(存錢、取錢的例子還記得嗎?)互斥量:資源獨占使用信號量:資源計數(shù)器事件對象:可以通過“通知”的方式來保持線程的同步。事件是WIN32中最靈活的線程間同步機制。事件存在兩種狀態(tài):激發(fā)狀態(tài)(SignaledorTrue)未激發(fā)狀態(tài)(UnsignaledorFalse)。3、詳細解釋:(見下面實驗內(nèi)容每個程序前)二、VC++(略)要用到的系統(tǒng)調(diào)用1、 2、實驗內(nèi)容1、用事件(Event)對象來進行線程同步n事件可分為兩類:n手動設(shè)置:這種對象只可能用程序手動設(shè)置,在需要該事件或者事件發(fā)生時,采用SetEvent及ResetEvent
3、來進行設(shè)置。n自動恢復(fù):一旦事件發(fā)生并被處理后,自動恢復(fù)到?jīng)]有事件狀態(tài),不需要再次設(shè)置。n_beginthread函數(shù):創(chuàng)建一個線程。所在庫文件:#include uintptr_t_beginthread( void(*start_address)(void*), unsignedstack_size, void*arglist ); 返回值: 假如成功,函數(shù)將返回一個處理信息對這個新創(chuàng)建的線程。如果失敗_beginthread將返回-1?! tart_address 新線程的起始地址,指向新線程調(diào)用的函數(shù)的起始地址stack_size
4、stack_size新線程的堆棧大小,可以為0arglistarglist傳遞給線程的參數(shù)列表,無參數(shù)是為NULL nCreateEvent函數(shù):創(chuàng)建事件對象windows.hHANDLECreateEvent( //SECURITY_ATTRIBUTES結(jié)構(gòu)指針,可為NULLLPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, //手動/自動 //TRUE:在WaitForSingleObject后必須手動調(diào)用ResetEvent清除信號 //FALSE:在WaitForSingleObject后,系統(tǒng)自動清除事
5、件信號 BOOLbInitialState,//初始狀態(tài) LPCTSTRlpName//事件的名稱);n使用“事件”機制應(yīng)注意以下事項:n如果跨進程訪問事件,必須對事件命名,在對事件命名的時候,要注意不要與系統(tǒng)命名空間中的其它全局命名對象沖突;n事件是否要自動恢復(fù);n事件的初始狀態(tài)設(shè)置。n由于event對象屬于內(nèi)核對象,故進程B可以調(diào)用OpenEvent函數(shù)通過對象的名字獲得進程A中event對象的句柄,然后將這個句柄用于ResetEvent、SetEvent和WaitForMultipleObjects等函數(shù)中。此法可以實現(xiàn)一個進程的線程控制另一進程中線程的運行,例如:HAN
6、DLEhEvent=OpenEvent(EVENT_ALL_ACCESS,true,"MyEvent");ResetEvent(hEvent);驗證程序:3個線程。主線程創(chuàng)建2個線程。一讀,一寫。寫線程(并不真寫,只是輸出writing等字符串)完成后,讀線程才能讀,讀線程完成后,主線程才能結(jié)束。新建一個Win32控制臺應(yīng)用程序項目(win32consoleapplication)#include"stdafx.h"#include#include#include#includeHANDL
7、EevRead,evFinish;//全局變量,事件對象的句柄voidReadThread(LPVOIDparam){WaitForSingleObject(evRead,INFINITE);//等待evRead被激活cout<<"Reading...讀完成,喚醒主線程"<