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

摘自(windows核心编程之线程基础)

2014-06-18 16:21 155 查看
线程两个组成部分:

一个是线程的内核对象,操作系统用它管理线程。

一个是线程栈,用于维护线程执行时所需要的所有函数和局部变量。

线程描述了进程内部的一条执行线路。

每次初始化进程时,系统都会创建一个主线程。这个线程首先会执行C/C++运行库的启动代码,后者调用

入口点函数(_tmain或_tWinMain),并继续执行,直至入口点函数返回C/C++运行库的启动代码,后者最终

调用ExitProcess。

每个线程都必须有一个入口点函数,这是线程执行的起点。

主线程的入口点函数:_tmain或_tWinMain.

如果想在主线程中创建辅助线程,它必须有自己的入口点函数。

线程函数可以执行我们希望它执行的任何任务。最终,线程函数将终止运行并返回。此时,线程将终止运行,

用于线程栈的内存也会被释放,线程内核对象的使用计数也会递减。如果使用计数变成0,线程内核对象会被销毁。

线程函数,需注意以下几点:

1.在默认的情况下,主线程的入口点函数必须命名为main,wmain,WinMain或者wWinMain.

与此不同的是,线程函数可以任意命名。事实上,如果应用程序中有多个线程函数,必须为它们

指定不同的名称。

2.因为主线程的入口点函数有字符串参数。所以它提供了ANSI/Unicode版本供我们选择:

main/wmain 和 WinMain/wWinMain.相反,线程函数只有一个参数。而且其意义由我们来定义。

3.线程函数必须返回一个值,它会成为该线程的退出代码。这类似于C/C++运行库策略:

令主线程的退出代码成为进程的退出代码。

//

4.线程函数(实际包括所有函数)应尽可能使用函数参数和局部变量。使用静态变量和全局变量时,多个

线程可以同时访问这些变量。这样可能破坏变量中保存的内容。然而,由于函数的参数和局部变量是在

线程栈上创建的。因此不太可能被其他线程破坏。

CreateThread函数

CreateThread函数是用于创建线程的Windows函数。如果写的是C/C++代码,就绝对不要调用CreateThread.

相反,正确的选择是使用MicrosoftC++运行库函数_beginthreadex.

HANDLE CreateThread{

PSECURITY_ATTRIBUTES psa,//给此参数传入NULL(一般都这样做)

DWORD cbStackSize,

PTHREAD_START_ROUTINE pfnStartAddr,

PVOID pvParam,

DWORD dwCreateFlags,

PDWORD pdwThreadID};

pfnStartAddr和pvParam

pfnStartAddr参数指定希望新线程执行的线程函数的地址。

线程函数的pvParam参数与最初传给CreateThread函数的pvParam参数是一样的。

dwCreateFlags参数:值为0,线程创建后立即就可以进行调度。值为CREATE_SUSPENDED,系统将创建

并初始化线程,但是会暂停线程的运行,这样线程无法进行调度。

pdwThreadID参数,它必须是DWORD的一个有效地址。

CreateThread函数用它来存储系统分配给新线程的ID。可以为这个参数传递NULL(一般这样做),告诉函数我们对线程ID不感兴趣。

终止运行线程:

<线程函数返回(这是强烈要求推荐的)

线程函数返回:

1.线程函数中创建的所有C++对象都通过其析构函数被正确销毁。

2.操作系统正确释放线程栈使用的内存。

3.操作系统把线程的退出代码设为线程函数的返回值。

4.系统递减少线程的内核对象的使用计数。

如果写C/C++代码:

用_beginthreadex而不要用CreateThread创建线程。

用_endthreadex而不要用ExitThread来终止线程运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: