windows进程和线程.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 Windows进程和线程 chensq8808@126.com 主要内容: windows进程 windows线程 线程同步 一. 进程 进程是不活泼的。若要使进程完成某项操作,它必须至少拥有一个线程,该线程负责执行包含在进程的地址空间中的代码。 实际上,单个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的代码。 为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。 每个进程至少拥有一个线程,来执行进程的地址空间中的代码。 Windows 进程操作相关API: CreateProcess():进程创建 ExitProcess()或TerminateProcess():进程退出 ExitProcess()终止一个进程和它的所有线程;它的终止操作是完整的,包括关闭所有对象句柄、它的所有线程等; TerminateProcess()终止指定的进程和它的所有线程;它的终止操作是不完整的(如:不向相关DLL通报关闭情况),通常只用于异常情况下对进程的终止。 范例:进程创建与退出 进程创建与退出 二. 线程 2.1 线程组成 线程也是由两个部分组成的: 一个是线程的内核对象,操作系统用它来对线程实施管理。 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。 几点提示: 同一进程中的线程共享这个进程的全部资源与地址空间,这样,多个线程确实能够非常容易地互相通信。 Windows支持的是内核级线程: 由内核完成创建和撤销; 内核维护进程和线程的上下文信息; 线程切换由内核完成; 一个线程发起系统调用而阻塞,不会影响其他线程的运行。 时间片分配给线程,所以多线程的进程获得更多CPU时间。 Windows是个抢占式多线程系统,依赖优先级。 2.2 创建线程的方法与区别(针对C/C++/MFC) 1、CreateThread( ) ——WIN32 API函数 2、_beginthreadex( ) ——MS对C Runtime库的扩展SDK函数 3、AfxBeginThread( ) ——MFC中线程创建的MFC函数 CreateThread: 提供操作系统级别的创建线程的操作,且仅限于工作者线程。线程函数中不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易使用,以免内存泄漏。 但它没有考虑: (1)C Runtime库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理(典型的例子是strtok函数) (2)MFC也需要知道新线程的创建,也需要做一些初始化工作。? _beginthreadex : MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。 仅使用Runtime Library时,可以用_BegingThread。 _beginthreadex函数在创建线程的时候分配了一个堆结构并和线程本身关联起来,这个结构叫做tiddata结构 ,线程创建时传入的线程入口函数地址就保存在这个结构中;另外,C运行时库中有些函数需要通过这个结构来保存和获取一些数据,比如说errno之类的线程全局变量。 当一个线程调用一个要求tiddata结构的C Runtime库函数的时候,将发生下面的情况: C Runtime库函数试图TlsGetvalue获取线程数据块的地址,如果没有获取到,函数就会现场分配一个 tiddata结构,并且和线程相关联,于是问题出现了,如果不通过_endthreadex函数来终结线程的话,这个结构将不会被撤销,内存泄漏就会出现了。但通常情况下,我们都不推荐使用_endthreadex函数来结束线程,因为里面包含了ExitThread调用。 AfxBeginThread : MFC中线程创建的MFC函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread,?? 在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex(AfxBeginThread相比较更为安全)创建线程。它简化了操作或让线程能够响应消息,即可用于界面线程,也可以用于工作者线程,但要注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。 使用准则: 如果线程函数中只调用 Win32 API ,就放心用 CreateThread; 如果要用到C Runtime库,那

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档