多线程学习笔记 二

本文详细介绍了Windows环境下线程的创建、控制及终止方法。包括使用CreateThread启动线程、GetExitCodeThread获取线程状态、ExitThread结束线程、CloseHandle关闭句柄以及WaitForSingleObject等待线程结束等API的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 结束一个线程 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
                         );



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值