多線程學習筆記 二
結束一個線程 GetExitCodeThread() 是判斷線程函數的結束而結束線程。有時候可能需要更強制性的手法結束一個線程 可以使用 ExitThread().
VOID ExitThread(
DWORD dwExitCode
);
參數說明:
dwExitCode 指定此線程之結束代碼。
返回值:沒有 此函數從不返回。
程序示例:
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
DWORD WINAPI ThreadFunc(LPVOID);
void AnotherFunc(void);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThrd;
DWORD exitCode = 0;
DWORD threadId;
hThrd = CreateThread(NULL,
0,
ThreadFunc,
(LPVOID)1,
0,
&threadId );
if (hThrd)
printf("Thread launched/n");
for(;;)
{
BOOL rc;
rc = GetExitCodeThread(hThrd, &exitCode);
if (rc && exitCode != STILL_ACTIVE )
break;
}
CloseHandle(hThrd);
printf("Thread returned %d/n", exitCode);
return EXIT_SUCCESS;
}
/*
* Call a function to do something that terminates
* the thread with ExitThread instead of returning.
*/
DWORD WINAPI ThreadFunc(LPVOID n)
{
printf("Thread running/n");
AnotherFunc();
return 0;
}
void AnotherFunc()
{
printf("About to exit thread/n");
ExitThread(4);
// It is impossible to get here, this line
// will never be printed
printf("This will never print/n");
}
CloseHandle 的重要性
BOOL CloseHandle(
HANDLE hObject
);
參數說明:
hObject 代表一個以打開之對象 handle
返回值:
如果成功 CloseHandle() 返回TRUE ,如果失敗則返回FALSE,此時可以調用GetLastError()獲知失敗原因。
等待一個線程的結束:
DWORD WaitForSingleObject(
HANDLE hHandle,
SWORD dwMilliseconds
);
參數說明:
hHandle:等待對象的 handle (代表一個核心對象)。在本例中此爲線程 handle
dwMilliseconds: 等待的最長時間。時間終了即使 handle 尚未成爲激發狀態,此函數還是要返回,此值可以是0(代表立刻返回) 也可以是INFINITE 代表無窮等待。
返回值:
如果函數失敗,則傳回WAIT_FAILED, 這時候你可以調用 GetLastError()取得更多信息。
1、等待的目標(核心對象)變成激發狀態,這種情況下返回值將爲 WAIT_OBJECT_0。
2、核心對象變爲激發狀態之前,等待時間終了,這種情況下返回值將爲 WAIT_TIMEOUT。
3、如果一個擁有 mutex(互斥器)的線程結束前沒有釋放 mutex,則傳回WAIT_ABANDONED。
獲得一個線程對象的 handle 之後,WaitForSingleObject()要求操作系統讓線程1睡覺,直到以下任何一種情況發生:
線程2結束、dwMilliseconds 時間終了,該值系從函數調用後開始計算。
for(;;)
{
BOOL rc;
rc = GetExitCodeThread(hThrd, &exitCode);
if (rc && exitCode != STILL_ACTIVE )
break;
}等同於 WaitForSingleObject(
hThrd,
INFINITE
);
VOID ExitThread(
DWORD dwExitCode
);
參數說明:
dwExitCode 指定此線程之結束代碼。
返回值:沒有 此函數從不返回。
程序示例:
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
DWORD WINAPI ThreadFunc(LPVOID);
void AnotherFunc(void);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThrd;
DWORD exitCode = 0;
DWORD threadId;
hThrd = CreateThread(NULL,
0,
ThreadFunc,
(LPVOID)1,
0,
&threadId );
if (hThrd)
printf("Thread launched/n");
for(;;)
{
BOOL rc;
rc = GetExitCodeThread(hThrd, &exitCode);
if (rc && exitCode != STILL_ACTIVE )
break;
}
CloseHandle(hThrd);
printf("Thread returned %d/n", exitCode);
return EXIT_SUCCESS;
}
/*
* Call a function to do something that terminates
* the thread with ExitThread instead of returning.
*/
DWORD WINAPI ThreadFunc(LPVOID n)
{
printf("Thread running/n");
AnotherFunc();
return 0;
}
void AnotherFunc()
{
printf("About to exit thread/n");
ExitThread(4);
// It is impossible to get here, this line
// will never be printed
printf("This will never print/n");
}
CloseHandle 的重要性
BOOL CloseHandle(
HANDLE hObject
);
參數說明:
hObject 代表一個以打開之對象 handle
返回值:
如果成功 CloseHandle() 返回TRUE ,如果失敗則返回FALSE,此時可以調用GetLastError()獲知失敗原因。
等待一個線程的結束:
DWORD WaitForSingleObject(
HANDLE hHandle,
SWORD dwMilliseconds
);
參數說明:
hHandle:等待對象的 handle (代表一個核心對象)。在本例中此爲線程 handle
dwMilliseconds: 等待的最長時間。時間終了即使 handle 尚未成爲激發狀態,此函數還是要返回,此值可以是0(代表立刻返回) 也可以是INFINITE 代表無窮等待。
返回值:
如果函數失敗,則傳回WAIT_FAILED, 這時候你可以調用 GetLastError()取得更多信息。
1、等待的目標(核心對象)變成激發狀態,這種情況下返回值將爲 WAIT_OBJECT_0。
2、核心對象變爲激發狀態之前,等待時間終了,這種情況下返回值將爲 WAIT_TIMEOUT。
3、如果一個擁有 mutex(互斥器)的線程結束前沒有釋放 mutex,則傳回WAIT_ABANDONED。
獲得一個線程對象的 handle 之後,WaitForSingleObject()要求操作系統讓線程1睡覺,直到以下任何一種情況發生:
線程2結束、dwMilliseconds 時間終了,該值系從函數調用後開始計算。
for(;;)
{
BOOL rc;
rc = GetExitCodeThread(hThrd, &exitCode);
if (rc && exitCode != STILL_ACTIVE )
break;
}等同於 WaitForSingleObject(
hThrd,
INFINITE
);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.