計算機線程技術電子教案_第1頁
計算機線程技術電子教案_第2頁
計算機線程技術電子教案_第3頁
計算機線程技術電子教案_第4頁
計算機線程技術電子教案_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計算機線程技術3 3、線程分類、線程分類 分為用戶接口線程和工作者線程。分為用戶接口線程和工作者線程。 用戶接口線程(用戶接口線程(User-interface threads ) 有消息泵。有消息泵。 運行于前臺,用于接收和處理系統消息,如窗口、控件運行于前臺,用于接收和處理系統消息,如窗口、控件動作消息處理、顯示等。動作消息處理、顯示等。 主線程一般為用戶線程。主線程一般為用戶線程。 工作者線程(工作者線程(Worker threads ) 無消息泵。無消息泵。 主要用于后臺運行,如數據計算等。主要用于后臺運行,如數據計算等。 子線程一般為工作者線程。子線程一般為工作者線程。二、線程的創建

2、、終止、掛起與恢復二、線程的創建、終止、掛起與恢復1 1、創建線程有三種方法、創建線程有三種方法: :(1) (1) 用用API函數,原型如下:函數,原型如下: HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, / 指向指向安全屬性結構安全屬性結構 DWORD dwStackSize, / 指定線程堆棧的大小指定線程堆棧的大小 LPTHREAD_START_ROUTINE lpStartAddress, /指向線程函數指向線程函數 LPVOID lpParameter, /傳遞給線程的參數值傳遞給線程的參數值 DWO

3、RD dwCreationFlags, / 創建標志。創建標志。0=創建后立即運行創建后立即運行 LPDWORD lpThreadId / 返回線程返回線程 ID ); 創建成功,返回句柄,否則返回創建成功,返回句柄,否則返回NULL(2) (2) 用用 MFC 函數,有兩種形式,原型如下:函數,有兩種形式,原型如下:u 創建工作者線程創建工作者線程 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, /線程函數名線程函數名 LPVOID pParam, /傳遞給線程函數的參數傳遞給線程函數的參數 int nPriority=TH

4、READ_PRIORITY_NORMAL, /線程的優先級線程的優先級 UINT nStackSize = 0, /指定線程堆棧的大小指定線程堆棧的大小 DWORD dwCreateFlags = 0, / 創建標志。創建標志。0=創建后立即運行創建后立即運行 LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL / 指向指向安全屬性結構安全屬性結構 );u 創建用戶接口線程創建用戶接口線程 CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, /指向線程的類對象指向線程的類對象 int nPriori

5、ty=THREAD_PRIORITY_NORMAL , /線程的優先級線程的優先級 UINT nStackSize =0, /指定線程堆棧的大小指定線程堆棧的大小 DWORD dwCreateFlags=0, / 創建標志。創建標志。0=創建后立即運行創建后立即運行 LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL / 指向指向安全屬性結構安全屬性結構 );(3) (3) 使用使用CWinThread類類CWinThread類支持用戶接口線程和工作者線程的創建、管理和刪除。類支持用戶接口線程和工作者線程的創建、管理和刪除。使用步驟為:使用步驟為:u先定義先定

6、義CWinThread類的對象類的對象 CWinThread MyThread;u給給該對象的有關成員賦初始值:該對象的有關成員賦初始值: MyThread.m_bAutoDelete=FALSE; /FALSE=線程終止時自動刪除線程終止時自動刪除 MyThread.m_pfnThreadProc=CMyThread; /指定線程函數指定線程函數 MyThread.m_pThreadParams=&dwParam; /傳遞給線程的參數傳遞給線程的參數u利用該對象的利用該對象的CreateThread( ) 方法方法創建線程。原型為:創建線程。原型為: BOOL MyThread.Cr

7、eateThread( DWORD dwCreateFlags = 0, / 創建標志。創建標志。0=創建后立即運行創建后立即運行 UINT nStackSize = 0, /指定線程堆棧的大小指定線程堆棧的大小 LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL / 指向指向安全屬性結構安全屬性結構 );2 2、線程的終止、線程的終止 當線程函數運行完畢時,可自動終止。當線程函數運行完畢時,可自動終止。 若要中途終止線程若要中途終止線程, ,可使用以下幾個函數之一可使用以下幾個函數之一: : VOID ExitThread( DWORD dwExitCo

8、de); /參數為終止碼參數為終止碼 功能:終止線程,并清除堆棧,激活附屬功能:終止線程,并清除堆棧,激活附屬DLL的入口點的入口點( (entry) ) 函數。函數。 BOOL TerminateThread( HANDLE hThread, /線程的句柄線程的句柄 DWORD dwExitCode /終止碼終止碼 ); 功能:終止線程,不做任何清除工作。功能:終止線程,不做任何清除工作。 void AfxEndThread( UINT nExitCode ); /參數為終止碼參數為終止碼 功能:終止線程。必須在線程函數內部調用。功能:終止線程。必須在線程函數內部調用。 注:線程終止碼可調用

9、注:線程終止碼可調用GetExitCodeThread( ) 函數得到,其原型為:函數得到,其原型為: BOOL GetExitCodeThread( HANDLE hThread, /線程的句柄線程的句柄 LPDWORD lpExitCode /指向接收終止碼的變量指向接收終止碼的變量 ); 3 3、線程的掛起與恢復、線程的掛起與恢復 線程掛起:停止調度該線程,但并未終止;線程掛起:停止調度該線程,但并未終止; 線程恢復:使掛起的線程恢復調度。線程恢復:使掛起的線程恢復調度。 DWORD SuspendThread( HANDLE hThread); /參數為線程的句柄參數為線程的句柄 功能

10、:使線程掛起次數加功能:使線程掛起次數加1 1,返回當前被掛起的次數。,返回當前被掛起的次數。 DWORD ResumeThread( HANDLE hThread); /參數為線程的句柄參數為線程的句柄 功能:使線程的掛起次數減功能:使線程的掛起次數減1 1,返回當前被掛起的次數。,返回當前被掛起的次數。說明:說明: 如果線程的掛起次數如果線程的掛起次數00,則線程被掛起,否則線程被調度。,則線程被掛起,否則線程被調度。三、線程的同步三、線程的同步 問題:問題: (1 1)多線程同時訪問一個資源,可能會引起沖突。例如:兩個線程)多線程同時訪問一個資源,可能會引起沖突。例如:兩個線程同時讀寫一

11、個同時讀寫一個I/OI/O接口。接口。 (2 2)兩個線程有序執行,線程)兩個線程有序執行,線程2 2必須等待線程必須等待線程1 1的執行結果出來后再的執行結果出來后再執行。執行。 解決辦法:解決辦法: 同步同步協調各線程的執行次序。協調各線程的執行次序。Windows系統提供了管理同步的四個對象:系統提供了管理同步的四個對象: (1 1) 事件對象(事件對象(Event) (2 2) 臨界區對象(臨界區對象(Critical Section) (3 3) 信號量對象(信號量對象(Semaphore) (4 4) 互斥量對象(互斥量對象(Mutex)u 這四個對象均有兩個狀態:有信號狀態、無信

12、號狀態。這四個對象均有兩個狀態:有信號狀態、無信號狀態。u 只有在有信號狀態時,線程才可以運行,否則必須等待。只有在有信號狀態時,線程才可以運行,否則必須等待。u 在線程內,使用在線程內,使用等待函數等待函數來等待有信號狀態的到來。來等待有信號狀態的到來。下面以事件對象為例,說明事件操作函數。下面以事件對象為例,說明事件操作函數。 (1 1) 創建事件對象創建事件對象, ,函數原型為:函數原型為: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, /指向安全屬性結構指向安全屬性結構 BOOL bManualReset, /

13、 手工重置事件。手工重置事件。 TRUE=手工重置事件手工重置事件 BOOL bInitialState, / 初始信號狀態。初始信號狀態。TRUE=有信號狀態有信號狀態 LPCTSTR lpName / 事件對象名事件對象名 ); (2 2)將事件置為有信號狀態,函數原型為:)將事件置為有信號狀態,函數原型為: BOOL SetEvent( HANDLE hEvent ); /參數為事件對象的句柄參數為事件對象的句柄 (3 3)將事件置為無信號狀態,函數原型為:)將事件置為無信號狀態,函數原型為: BOOL ResetEvent( HANDLE hEvent ); /參數為事件對象的句柄參數

14、為事件對象的句柄下面討論等待函數。其原型為:下面討論等待函數。其原型為:(1 1)等待單個事件對象變為有信號狀態)等待單個事件對象變為有信號狀態 DWORD WaitForSingleObject( HANDLE hHandle, /要等待的事件對象的句柄要等待的事件對象的句柄 DWORD dwMilliseconds /等待時間(毫秒)等待時間(毫秒) ); 功能:等待,直到要等待的事件對象變為有信號,或等待時間到達為功能:等待,直到要等待的事件對象變為有信號,或等待時間到達為止。止。 (2 2)等待多個事件對象變為有信號狀態等待多個事件對象變為有信號狀態 DWORD WaitForMult

15、ipleObjects( DWORD nCount, /事件對象的句柄個數事件對象的句柄個數 CONST HANDLE *lpHandles, /指向指向事件對象的句柄數組事件對象的句柄數組 BOOL fWaitAll, /等待標志,等待標志,TRUE=所有事件所有事件 DWORD dwMilliseconds /等待時間(毫秒)等待時間(毫秒) ); 功能:等待,直到要等待的所有(或某個)事件對象變為有信號,或功能:等待,直到要等待的所有(或某個)事件對象變為有信號,或等待時間到達為止。等待時間到達為止。四、線程編程四、線程編程u 步驟:步驟: (1 1)創建事件對象,用于管理線程的同步;)創建事件對象,用于管理線程的同步; (2 2) 創建線程,使他們投入運行;創建線程,使他們投入運行; (3 3) 在線程內部使用等待函數實現同步;在線程內部使用等待函數實現同步; (4 4) 在線程內部

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論