c++多線程筆記2 線程的基本管理

線程的基本管理:

設置線程的優先級

線程優先級 = 進程優先級 + 線程相對優先級

Bool SetThreadPriority (HANDL E hPriority , int nPriority)

線程的掛起與恢復

進程中的每個線程都有掛起計數器(suspend count) 。當掛起計數器值爲0 時,線程被執行;當掛起計數器值大於0 時,調度器不去調度該線程。

DWORD SuspendThread(HANDLE hThread);

DWORD ResumeThread(HANDLE hThread);

線程等待

一組能使線程阻塞其自身執行的等待函數

WaitForSingleObject 等待單個線程結束

WaitForMultipleObjects 等待多個線程結束

線程終結

  1. VOID ExitThread(DWORD dwExitCode);//該函數用於線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode 用來設置線程的退出碼。

  2. BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

​ 一般情況下,線程運行結束之後,線程函數正常返回,但是應用程序可以調用

​ • TerminateThread 強行終止某一線程的執行。各參數含義如下:

​ • hThread:將被終結的線程的句柄;

​ • dwExitCode:用於指定線程的退出碼。

​ 使用 TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但並不釋放線程所佔用的資源。因此,一般不建議使用該函數。

舉一個簡單實例:

#include "stdio.h"
#include "windows.h"
DWORD WINAPI ThreadProc (PVOID pParam)//附加線程函數
{
printf("hello thread\n");
return 0;
}
int main(int argc, char* argv[])//進程的主線程入口點
{
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
//附加線程的創建
return 0;
}

有一個非常重要的問題就是線程之間的運行問題,明明是並行但是卻又無法打印出來。我 們可以調用 WaitForSingleObject()函數來強制主線程等待附加線程的退出。

DWORD WaiteForSingleObject( 

HANDLE hHandle,//等待句柄

DWORD dwMilliseconds);//等待時間上限

功能:WaitForSingleObject()調用後,只有滿足兩種情況,纔會返回,這兩種情況

如下:

\1. 等待上限時間,即函數等待時間超過設定的時間上限 dwMiliseconds 時,函數將返回。因此也可以設定 dwMiliseconds 爲 IFINITE,即無時間上限,函數在不滿足第二種情況下將一直等待。

\2. 等待對象處於了有信號狀態,即線程句柄 hHandle 處於有信號狀態。線程在執行過中,它所對應的句柄會是無信號狀態的,只有當線程運行完畢返回時,線程對象句柄纔是有信號狀態的。

如果是多個附加線程情況,使用用 WaitForMultipleObjects ()函數來實現,函數結構如下:

DWORD WaitForMultipleObjects (
DWORD nCount,//需要等待線程對象的個數
CONST HANDLE*lpHandles,//需要等待的線程句柄數組指針
BOOL fWaitALL, //是否等待所有的對象句柄爲有信號狀態(TRUE),還是隻等待任一對
象句柄唯有信號狀態(FALSE);
DWORD dwMilliseconds)//需要等待的時間上線,單位爲毫秒;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章