windows多線程編程

來源:互聯網
上載者:User

 

當進程結束後所有線程都終止。多線程編程最大的問題在於共用資料的存取控制。
直接用Win32 API進行編程有很多優點:基於Win32的應用程式執行代碼小,運行效率高。但是它要求程式員編寫的代碼較多,且需要管理所有系統提供給程式的資源。

 建立線程

HANDLE CreateThread(     
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD    
SIZE_T dwStackSize,                                    // initial stack size    
LPTHREAD_START_ROUTINE lpStartAddress,    // thread function    
LPVOID lpParameter,                                    // thread argument    
DWORD dwCreationFlags,                            // creation option    
LPDWORD lpThreadId                                 // thread identifier  
);   
 線程函數原型:DWORD WINAPI Fun(LPVOID lpParamter);
 參數說明:
lpThreadAttributes :NULL使用預設安全性,不可以被子線程繼承,否則需要定義一個結構體將它的bInheritHandle成員初始化為TRUE。
dwStackSize:設定初始棧的大小,以位元組為單位,如果為0,那麼預設將使用與調用該函數的線程相同的棧空間大小。任何情況下,Windows根據需要動態延長堆棧的大小。
lpStartAddress:指向線程函數的指標,形式:@函數名,函數名稱沒有限制,但是必須以下列形式聲明:DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正確將無法調用成功。但lpStartAddress要這樣通過LPTHREAD_START_ROUTINE轉換如:(LPTHREAD_START_ROUTINE)MyVoid。MyVoid聲明為 void MyVoid();
lpParameter:向線程函數傳遞的參數,是一個指向結構的指標,不需傳遞參數時,為NULL。
dwCreationFlags:可取如下標誌
1. CREATE_SUSPENDED(0x00000004):建立一個掛起的線程
2. 0:表示建立後立即啟用
3. STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數指定初始的保留堆棧的大小,否則,dwStackSize指定提交的大小。該標記值在Windows 2000/NT and Windows Me/98/95上不支援。
lpThreadId:儲存新線程的id。
傳回值:
如果CreateThread成功,傳回一個handle,代表新線程。否則傳回一個FALSE。如果失敗,你可以調用GetLastError()獲知原因。
必須指定的參數是lpStartAddress,其它的都可以用預設值0或NULL。

 

 恢複/掛起線程

DWORD WINAPI ResumeThread( __in HANDLE hThread);
調用該函數可以啟用一個掛起的線程。
這個函數和SuspendThread相對應。建立線程是可以建立掛起的線程
(dwCreationFlags參數指定),掛起的線程直到調用ResumeThread才開始執行。

 設定線程優先順序
BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority     // thread priority level
);
 nPriority 優先順序別參數 可設定為以下參數
THREAD_PRIORITY_ABOVE_NORMAL 為比一般優先順序高一個等級
THREAD_PRIORITY_BELOW_NORMAL 比一般低一個等級
THREAD_PRIORITY_HIGHEST   比一般高2個等級
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST    比一般低2個等級
THREAD_PRIORITY_NORMAL   一般等級
THREAD_PRIORITY_TIME_CRITICAL

 終止線程

 線程內終止
如果某線程調用了ExitThread函數就可以終止它自己。
VOID ExitThread(DWORD dwExitCode);
dwExitCode: 指定線程的推出碼。
 線程外終止
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);
作用:
線上程外終止一個線程,用於強制終止線程。
參數說明:
HANDLE htread:被終止的線程的控制代碼,為CWinThread指標。
DWORD dwExitCode:退出碼。

 關閉控制代碼

在CreateThread成功之後會返回一個hThread的handle,且核心對象的計數加1,CloseHandle之後,引用計數減1,當變為0時,系統刪除核心對象。
但是這個handle並不能完全代表這個線程,它僅僅是線程的一個“標識”,系統和使用者可以利用它對相應的線程進行必要的操縱。如果線上程成功建立後,不再需要用到這個控制代碼,就可以在建立成功後,線程退出前直接CloseHandle掉,但這並不會影響到線程的運行。

不執行CloseHandle() 帶來的後果:
若線上程執行完之後,沒有通過CloseHandle()將引用計數減1,在進程執行期間,將會造成核心對象的泄露,相當與控制代碼泄露,但不同於記憶體泄露, 這勢必會對系統的效率帶來一定程度上的負面影響。但是,請記住,當進程結束退出後,系統仍然會自動幫你清理這些資源。但是在這裡不推薦這種做法,畢竟不是 一個良好的編程習慣!
( 應用程式運行時,有可能泄露核心對象,但是當進程終止運行時,系統能確保所有內容均被正確地清除。另外,這個情況是用於所有對象,資源和記憶體塊,也就是說,當進程終止時,系統將保證不會留下任何對象。)

 判斷程式運行狀態
線程結束代碼可以藉由調用GetExitCodeThread()而得知。
BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode);

 同步與互斥

Win32 API提供了一組能是線程阻塞自身執行的等待函數。這些等待函數在其參數中的一個或多個同步對象產生了訊號,或者超過規定的等待時間才會返回。在等待未返回時,線程處於等待狀態,此時線程只消耗很少的CPU。
最常用的等待函數是:
DWORD WINAPI WaitForSingleObject(
  __in HANDLE hHandle,
  __in DWORD dwMilliseconds
);
 參數:
hHandle: 物件控點。可以指定一系列的對象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
當等待仍在掛起狀態時,控制代碼被關閉,那麼函數行為是未定義的。該控制代碼必須具有 SYNCHRONIZE 存取權限。
dwMilliseconds: 定時時間間隔,單位為milliseconds(毫秒).如果指定一個非零值,函數處於等待狀態直到hHandle 標記的對象被觸發,或者時間到了。如果dwMilliseconds 為0,對象沒有被觸發訊號,函數不會進入一個等待狀態,它總是立即返回。如果dwMilliseconds 為INFINITE,對象被觸發訊號後,函數才會返回。

傳回值:
WAIT_ABANDONED 0x00000080:當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此傳回值。
  WAIT_OBJECT_ 0  0x00000000 :核心對象已被啟用
  WAIT_TIMEOUT  0x00000102:等待逾時
WAIT_FAILED    0xFFFFFFFF :出現錯誤,可通過GetLastError得到錯誤碼

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.