Drecik学习经验分享
转载请注明出处:http://blog.csdn.net/drecik__/article/details/8086020
创建线程之前的准备
每个线程必须有一个入口点函数,这个是线程执行的起点,所以创建线程前必须先声明或定义,函数原型
DWORD WINAPI ThreadFunc( PVOID pParam );
注意:函数名可以自己取。线程函数应该尽可能使用函数参数和局部变量。
创建线程
在Windows编程中可以使用函数CreateThread,但是如果写C/C++代码应该使用_beginthreadex
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性;
SIZE_T dwStackSize, // 栈的大小;
LPTHREAD_START_ROUTINE lpStartAddress, // 线程入口点函数;
LPVOID lpParameter, // 传给线程入口点函数的参数,可以传入希望线程获得的数据;
DWORD dwCreationFlags, // 创建的线程是否挂起,0为不挂起,CREATE_SUSPENDED为挂起;
LPDWORD lpThreadId // 返回线程的ID,建议使用句柄操作,所以传入NULL即可;
);
结束线程
线程结束有以下四种方式,但只建议发生在第一种情况下
- 线程函数返回
- 通过调用ExitThread函数杀死自己(避免)
- 同一个进程或另一个进程中的线程调用TerminateThread函数(避免)
- 包含该线程的进程终止运行(避免)
设计线程函数时候,应该确保在我们希望线程终止运行时,就让它们返回,这是保证线程的所有资源都被正确清理的唯一方式,否则只能等到进程结束时操作系统来清理。
线程函数返回时,可保证以下清理操作:
- 线程函数中创建的所有C++对象调用其析构函数
- 操作系统正确释放线程栈使用的内存
- 操作系统把线程的退出代码设为线程函数的返回值
- 系统递减线程的内核对象的使用计数
线程终止运行时,操作系统所做的事情:
- 该线程拥有的所有用户对象句柄会被释放
- 线程的退出代码从STILL_ACTIVE编程传递给ExitThread或TerminateThread的代码
- 线程内核对象的状态变为触发
- 如果线程是进程中最后一个活动线程,系统认为进程也终止了
- 线程内核对象的使用计数减1
其他线程可以使用GetExitCodeThread来检查线程的退出代码,没有退出会得到STILL_ACTIVE