Windows 线程(三) 线程的退出和启动
线程的退出
进程的退出
我们的一个进程在销毁的时候, 会经过以下步骤
- 销毁临时对象
- 释放堆栈
- 将返回值设置为退出代码
- 减少进程内核对象的使用计数
线程的退出
而线程的销毁与进程销毁过程大致相同
- 销毁临时对象, 调用析构函数
释放线程里所分配的栈
- 同时还会释放两个属于线程的内核对象
- 释放线程拥有的
窗口内核对象 - 释放线程拥有的
HOOK内核对象
- 将线程入口函数的返回值设置为退出代码
- 减少线程内核对象的使用计数
进程的退出, 其实就是主线程的退出
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;
}线程退出函数
ExitThread
- 立即结束当前线程
- 它会终止当前线程的运行
- 会销毁当前线程的
栈 - 但是它
不会调用析构函数 - 调用该函数容易造成内存泄露, 使用时一定要注意
TerminateThread
- 可以结束其他的线程
编码过程中不推荐使用这两个API
深入理解线程的启动
拥有一个线程内核对象结构体
- 包括使用计数
- 退出代码(ExitCode)
线程信号状态(Signaled)
- 是否能够接受信号
- 有信号的时候, CPU去执行它
- 没有信号的时候, CPU不会去执行它
拥有一个线程上下文(Context)
- 存储CPU寄存器的状态
- EIP(IP) 指令寄存器
- ESP(SP) 栈寄存器
申请一块内存, 作为当前线程的栈
- 这段空间是
属于进程的 - 入栈
lpStartAddress和lParam两个参数
- 这段空间是
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-06-15 at 03:45 pm