Windows核心编程:线程基础

本文详细介绍了Windows核心编程中的线程基础,包括线程的概念、创建线程的函数CreateThread、线程的终止方法以及C/C++运行库在多线程中的注意事项。线程由CPU寄存器、栈、TLS等组成,创建线程通常使用BeginThreadEx,线程通过返回线程函数或调用ExitThread、TerminateThread等方式终止。文章强调避免直接使用ExitThread,推荐使用C++运行库函数来管理线程。
摘要由CSDN通过智能技术生成

作者:shenzi

链接:http://blog.csdn.net/shenzi

Windows核心编程:线程基础

2.线程
    2.1线程概念
     线程包括下面的必要组件:

  • CPU寄存器的内容,它表示寄存器的状态;
  • 两个栈:一个是以内核模式执行时被线程使用,另一个则是以用户模式执行时被线程使用;
  • 被称为“本机线程存储区”(TLS)的专用存储区,供子系统、运行时库和DLL使用;
  • 称为“线程ID”的唯一标示符(内部也称为“客户ID”,进程ID和线程ID产生于不同的名字空间,因此它们不会重叠);
  • 线程有时有自己的被多线程服务器应用程序使用的安全环境,多线程服务器应用程序模拟它们服务的客户的安全环境;   

     易失寄存器、栈和专用存储区被称为线程的环境,这些信息对于每个机器体系结构来说是不同的,这种结构取决于特定的体系结构。尽管线程有它们自己的执行环境,但进程中的每个线程都共享进程的虚拟地址空间和资源。
    2.2何时创建线程
    每次初始化进程时,系统都会创建一个主线程。对于用Microsoft C/C++编译器生成的应用程序,这个线程首先会执行C/C++运行库的启动代码,后者调用入口点函数(_tmain_tWinMain ),并继续执行,直至入口点函数返回C/C++运行库的启动代码,后者最终将调用ExitProcess
    每个线程都必须有一个入口点函数,这是线程执行的起点。主线程的入口点函数:_tmain或_tWinMain。如果想在进程中常见辅助线程,它必须有自己的入口点函数,形式如下:
DWORD WINAPI ThreadFunc(PVOID pvParam){
    DWORD dwResult = 0;
     ...
    return(dwResult);
}

    线程函数可以执行我们希望它执行的任何任务。最终线程函数将终止运行并返回。此时,线程将终止运行,用于线程栈的内存也会被释放,线程内核对象的使用计数也会递减。如果使用计数变为0,线程内核对象会被销毁。

  • 默认情况下,主线程的入口点函数必须命名为main,wmain,WinMain或wWinMain(除非用/ENTRY: 链接器选项来制定另一个函数作为入口点函数)。与此不同的是,线程函数可以任意命名。
  • 主线程入口点函数有字符串参数,所以它提供了ANSI/Unicode版本。相反,线程函数只有一个参数,而且意义由我们(而非操作系统)来定义。
  • 线程函数必须返回一个值,它会成为该线程的退出代码。C/C++的策略:令主线程的退出代码成为进程的退出代码。
  • 线程函数应尽可能使用函数参数和局部变量。使用静态变量和全局变量时,多个线程可以同时访问这些变量,这样可能会破坏变量中保存的内容。由于函数的参数和局部变量在线程栈上创建,一次不太可能被其它线程破坏。   

      2.3 CreateThread函数
      如果想创建一个或多个辅助线程,只需让一个正在运行的线程调用CreateThread
    HANDLE CreateThread(
        PSECURITY_ATTRIBUTES psa,//指向SECURITY_ATTRIBUTES结构的指针;
        DWORD cbStackSize,//制定线程可以为其线程栈使用多少地址空间;
        PTHREAD_START_ROUTINE pfnStartAddr,//线程函数的地址;
        PVOID pvParam,//线程函数参数
        DWORD dwCreateFlags,指定额外的标志来控制线程的创建;
        PDWORD pdwThreadID);//存储系统分配给新线程的ID;

     调用 CreateThread 时,系统会创建一个县城内核对象。系统从进程地址空间中分配内存给线程栈使用。新线程可以访问进程内核对象的所有句柄、进程中的所有内存以及同一个进程中其它所有线程的栈。
      CreateThread 函数时用于创建线程的Windows函数。不过如果写的是C/C++代码,就绝对不要调用 CreateThread。 正确地选择是使用Microsoft C++运行库函数_beginthreadex 。如果使用的不是Microsoft C++编译器,你的编译器的提供商应该提供类似的函数来替代 CreateThread 。不管这个替代函数时什么,都必须使用它。
    2.4终止运行线程
    线程可以通过以下4种方法来终止运行:

  • 线程函数返回(这是强烈推荐的);
  • 线程通过ExitThread 函数“杀
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值