多線程學習筆記 二

 結束一個線程 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
                         );



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章