Windows核心编程学习笔记(9)--线程创建与结束线程

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即可;
	);


结束线程

线程结束有以下四种方式,但只建议发生在第一种情况下

  1. 线程函数返回
  2. 通过调用ExitThread函数杀死自己(避免)
  3. 同一个进程或另一个进程中的线程调用TerminateThread函数(避免)
  4. 包含该线程的进程终止运行(避免)

设计线程函数时候,应该确保在我们希望线程终止运行时,就让它们返回,这是保证线程的所有资源都被正确清理的唯一方式,否则只能等到进程结束时操作系统来清理。

线程函数返回时,可保证以下清理操作:

  1. 线程函数中创建的所有C++对象调用其析构函数
  2. 操作系统正确释放线程栈使用的内存
  3. 操作系统把线程的退出代码设为线程函数的返回值
  4. 系统递减线程的内核对象的使用计数

线程终止运行时,操作系统所做的事情:

  1. 该线程拥有的所有用户对象句柄会被释放
  2. 线程的退出代码从STILL_ACTIVE编程传递给ExitThread或TerminateThread的代码
  3. 线程内核对象的状态变为触发
  4. 如果线程是进程中最后一个活动线程,系统认为进程也终止了
  5. 线程内核对象的使用计数减1

其他线程可以使用GetExitCodeThread来检查线程的退出代码,没有退出会得到STILL_ACTIVE

你可能感兴趣的:(编程,windows,活动,null,attributes,winapi)