您的位置:首页 > 编程语言

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

2012-10-18 16:07 183 查看
Drecik学习经验分享

转载请注明出处:/article/3712375.html



创建线程之前的准备

每个线程必须有一个入口点函数,这个是线程执行的起点,所以创建线程前必须先声明或定义,函数原型

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: