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