PoEdu培训 Windows班 第二十二课 Windows 线程(三) 线程的退出和启动
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第二十二课 Windows 线程(三) 线程的退出和启动

文章类别: 培训笔记 0 评论

Windows 线程(三) 线程的退出和启动

线程的退出

进程的退出

我们的一个进程在销毁的时候, 会经过以下步骤

  1. 销毁临时对象
  2. 释放堆栈
  3. 将返回值设置为退出代码
  4. 减少进程内核对象的使用计数

线程的退出

而线程的销毁与进程销毁过程大致相同

  1. 销毁临时对象, 调用析构函数
  2. 释放线程里所分配的栈

    • 同时还会释放两个属于线程的内核对象
    • 释放线程拥有的窗口内核对象
    • 释放线程拥有的HOOK内核对象
  3. 将线程入口函数的返回值设置为退出代码
  4. 减少线程内核对象的使用计数

进程的退出, 其实就是主线程的退出

CloseHandle

CreateThread之后, 一定要记得CloseHandle
在上节课的示例代码中, 我们就没有写 CloseHandle
修改过的代码如下:

#include <Windows.h>
#include <tchar.h>
#include <iostream>

enum ThreadSignal
{
    THREAD_NO_0,
    THREAD_NO_1,
    THREAD_NO_2,
    THREAD_NO_3
};

ThreadSignal g_ThreadSignal = THREAD_NO_0;

DWORD WINAPI ThreadMainNo1(LPVOID lParam)
{
    for (size_t i = 0; i < 101; i++)
    {
        while (g_ThreadSignal != THREAD_NO_1)
        {
            Sleep(1);
        }
        _tprintf(TEXT("ThreadNo1: [%d]\n"), i);
        // 希望NO2执行
        g_ThreadSignal = THREAD_NO_2;
    }
    return 0;
}

DWORD WINAPI ThreadMainNo2(LPVOID lParam)
{
    for (size_t i = 101; i < 201; i++)
    {
        while (g_ThreadSignal != THREAD_NO_2)
        {
            Sleep(1);
        }
        _tprintf(TEXT("ThreadNo2: [%d]\n"), i);
        // 希望NO3执行
        g_ThreadSignal = THREAD_NO_3;
    }
    return 0;
}

INT _tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));

    HANDLE hThreads[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE };

    hThreads[0] = CreateThread(NULL, 0, ThreadMainNo1, NULL, 0, NULL);
    hThreads[1] = CreateThread(NULL, 0, ThreadMainNo2, NULL, 0, NULL);

    g_ThreadSignal = THREAD_NO_1;

    for (size_t i = 201; i < 301; i++)
    {
        while (g_ThreadSignal != THREAD_NO_3)
        {
            Sleep(1);
        }
        _tprintf(TEXT("ThreadNo3: [%d]\n"), i);
        // 希望NO1执行
        g_ThreadSignal = THREAD_NO_1;
    }

    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);

    CloseHandle(hThreads[0]);
    CloseHandle(hThreads[1]);

    return 0;
}

线程退出函数

编码过程中不推荐使用这两个API

深入理解线程的启动

未完待续...

如有错误,请提出指正!谢谢.

回复