第二讲:线程的基本使用.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二讲:线程的基本使用

第二讲:线程的基本使用 在上一讲中我们学习了进程、线程和多线程的概念,了解到了可以在我们所编写的程序中利用线程来提高程序的执行效率。那么如何使用线程呢?接下来为大家揭晓答案…… 【多线程的回顾】 以往我们所编写的程序只有一个执行通道,那就是我们的主函数,只有一条通道这就意味着同一时刻只能够有一条指令被执行。这就好比我们去火车站等待检票,当只有一个通道时,我们就必须要等待前面的人检完票后我们才能够被检票。这样做的效率是十分低下的,而且还会造成很多不必要的时间浪费。为了提高检票的效率在节假日人多的时候就会重新开辟一条检票通道,这样两个通道同时检票可以帮助我们节省下不少的时间。这样的机制在计算机领域中称之为“并发性”。多线程同样也是这个道理,利用多线程机制我们可以在程序中开辟多个执行代码的通道,让不同的通道同时执行指令(就好像工厂里不同的工人负责的事情不同)提高程序执行的效率,把能够一起做的事情一起做,这样就可以大大提高效率减少不必要的时间浪费。 【什么是线程】 在学习编程时,通常都是从编写顺序程序开始的。每一个顺序程序都有一个开始,然后执行一系列的指令,直至结束。这样的程序在运行时的任意时刻,程序中只有一个点(一条语句)被执行。 线程是操作系统可以调度的最小单位,通常是将程序拆分成2个或者多个并发运行的任务。一个线程就是一段顺序程序。但是线程是不能够独立运行的,它属于某一个具体的程序。(进程) 不同的操作系统实现进程和线程的方式也不同,在Windows操作系统中是在进程中包含线程。一个进程可以存在多个线程,线程可以共享进程的资源(例如内存)。而不同的进程之间是不能够直接共享资源的。 比较经典的情况是进程中的多个线程执行相同的代码,并共享进程中的变量。例如上述笔者提到过的多个通道同时检票。当然这种情况是不共享变量的,因为每个检票员的手上都有一个检票钳。共享变量的情况可以类似于厨师做菜。几个厨师按照相同的菜谱做菜,他们共同使用一些食材,每个厨师对食材的使用情况会影响其他厨师的工作。 在目前的CPU中,多个线程同时运行,每个处理器或者核心运行一个线程。 【创建线程】 在一些复杂的信息处理系统中通常为了提高应用程序的并发能力,都会采用多线程的编程方法。那么在MFC架构中如何创建一个线程呢?首先让我们来了解一下“线程函数”的概念。 线程函数: 每一个线程必须拥有一个进入点函数,线程从这个进入点开始运行。主线程的进入点函数为主函数main(),如果想在进程中创建一个辅助线程,也必须为该辅助线程指定一个进入点函数,这个函数也被称之为“线程函数”。线程函数的声明格式如下: DWORD WINAPI Thread_Function_Name(LPVOID Parameter_Name) { //函数体 } 其中,DWORD WINAPI说明线程函数的类型是不可变的,而Thread_Function_Name则说明了线程的名称,是可以由程序员自己指定的,LPVOID类型是一个void*类型的指针,用于提供线程和外界通信的通道。而函数体中则说明该线程具体要执行的代码。 创建线程: 在MFC中通常我们使用CreateThread函数创建一个新的线程。函数原型如下: HANDLE CreateThread( SECURITY_ATTRIBUTES* lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, DWORD* lpThreadId ) 其中: IpThreadAttributes指向LPSCURITY_ATTRUBUTES的结构体指针,用于决定CreateThread函数返回的句柄是否可以被子进程所继承,通常我们设置该参数为NULL; dwStackSize用于指定线程堆栈的初始大小,单位为字节,通常我们也设置为NULL; IpStartAddress指定线程函数的起始地址,通常直接填写线程函数的名称即可; IpParameter指定传递给线程函数的参数; dwCreationFlags指定线程在创建后是否立即启动,如果指定为CREATE_SUSPENDED则线程创建后进入挂起状态,而如果将该参数指定为0或者NULL则线程在创建后将立即启动。 IpThreadId参数是一个指向DWORD(unsigned long)类型的参数指针,用于获取线程的ID,即TID(线程编号)。在Windows操作系统中,每一个进程中的线程都有一个唯一的TID。 小提示: 在MFC中通常带有指针的类型均已“LP”开头,例如LPVOID即“void*”类型。DWORD是指双

文档评论(0)

l215322 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档