孙鑫多线程笔记.doc

上传人:枫** 文档编号:548098987 上传时间:2022-10-26 格式:DOC 页数:20 大小:236.01KB
返回 下载 相关 举报
孙鑫多线程笔记.doc_第1页
第1页 / 共20页
孙鑫多线程笔记.doc_第2页
第2页 / 共20页
孙鑫多线程笔记.doc_第3页
第3页 / 共20页
孙鑫多线程笔记.doc_第4页
第4页 / 共20页
孙鑫多线程笔记.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《孙鑫多线程笔记.doc》由会员分享,可在线阅读,更多相关《孙鑫多线程笔记.doc(20页珍藏版)》请在金锄头文库上搜索。

1、孙鑫VC学习笔记:多线程编程=程序&进程&线程= 程序 & 进程程序计算机指令的集合,它以文件的形式存储在磁盘上进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动区别:进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立的运行的单位,因此,他不占用系统的运行资源。 进程由两个部分组成:1、操作系统用来管理进程的内核对象。内核对象是操作系统内部分配的一个内存块,内核对象也是系统用来存放关于进程的统计信息的地方。2、地址空间。它包含所有可执行模块或DLL模块的代码和数据。他还包含动态内存分配的

2、空间。如线程堆栈和堆分配空间。内核对象:是操作系统内部分配的一个内存块,它是一种只能被内核访问的数据结构,其成员负责维护该对象的各种信息,应用程序无法找到并直接改变它们的内容,只能通过Windows提供的函数对内核对象进行操作。 进程进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的一个线程,称为主线程。此后,

3、该线程可以创建其他的线程 线程线程有两个部分组成:1。线程的内核对象,操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方。2。线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他

4、线程的堆栈。这使得单个进程中的多个线程确实能够非常容易的互相通信。线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。 线程运行对于单个CPU操作系统为每一个运行线程安排一定的CPU时间时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时进行的一样。如果计算机拥有多个CPU,线程就能真正意义上运行了 注意我们可以用多进程代替多线程,但是这样不是明智的,因为1.每新建一个进程,系统要为之分配4GB的虚拟内存,浪费

5、资源;而多线程共享同一个地址空间,占用资源较少2.在进程之间发生切换时,要交换整个地址空间;而线程之间的切换只是执行环境的改变,效率较高。=线程的创建= 实例着手= 实例1#include windows.h#include iostreamusing namespace std;DWORD WINAPI Fun1Proc(LPVOID lpParameter);/声明线程入口函数void main()/创建新线程HANDLE hThread1;hThread1 = CreateThread( NULL,/使用缺省的安全性0,/初始提交的栈的大小Fun1Proc,/线程入口函数NULL,/传递

6、为线程的参数0,/附加标记 0表示线程创建后立即运行NULL);/线程ID/关闭线程句柄,但不会终止新建的线程CloseHandle(hThread1);coutmain thread is runningendl;Sleep(1000);/暂停主线程/*说明:如果不添加Sleep语句,主线程会在自己的时间片中运行完成后(该时间片在main函数,也就是主线程全部执行完毕后还有时间剩余),选择直接退出,主线程都退出了,依附于主线程的新线程也就不会有机会得到执行了,只有让主线程暂停执行(采用sleep函数),即挂起,让出执行的权利,操作系统会从等待的线程中选择一个来运行,那么新创建的线程得到机会执

7、行*/DWORD WINAPI Fun1Proc(LPVOID lpParameter)coutthread1 is running!endl;return 0;结果:孙鑫给的是main thread is running 换行 thread1 is running! 我的结果:在VC6.0下,一通乱码;在VS2008下,没出现换行分析:估计原因出自我的本本是双核的,而VC6.0的乱码是因为装了插件缘故,不知是否是这样?= 实例2添加全局变量int index=0;将main函数中输出语句修改为:while(index+50) coutmain thread is runningendl;将线

8、程中输出语句修改为:while(index+50)coutthread1 is running!endl;将main函数中sleep语句省去 说明:主线程和副线程在交替运行,也就是主线程在它的时间片运行结束后,副线程得到执行的权利,在它自己所对应的时间片中运行,此时主线程其实还没有运行结束,它将等待着副线程运行结束后继续执行= 步骤说明 【思路】:线程创建= 一、创建一个线程创建线程使用CreateThread:The CreateThread function creates a thread to execute within the address space of the callin

9、g process. HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, /结构体指针DWORD dwStackSize, /指定初始提交栈的大小LPTHREAD_START_ROUTINE lpStartAddress, /由线程执行,表示线程的起始地址,指定线程入口函数,LPVOID lpParameter, /指定一个单独的值传递给线程DWORD dwCreationFlags, /指定控件线程创建的附加标记LPDWORD lpThreadId ); /指向一个用来接收线程的标识符变量参数1指向SECURITY_AT

10、TRIBUTES结构体的指针。这里可以设置为NULL,使用默认的安全性参数2指定初始提交的栈的大小,即线程可以将多少地址空间用于自己的栈,以字节为单位。系统会将这个值四舍五入为最近的页面如果该值是0或者小于缺省提交大小,则使用和调用线程一样的大小。页 面系统管理内存时使用的内存单位,不同的CPU其页面大小也是不同的。X86使用的页面大小是4KB。当保留地址空间的一个区域时,系统要确保该区域的大小是系统的页面大小的倍数 参数3指向LPTHREAD_START_ROUTINE(应用程序定义的函数类型)的指针。这个函数将被线程执行,表示了线程的起始地址,指定线程入口函数,该入口函数的参数类型以及返回

11、类型要与ThreadProc()函数声明的类型要保持一致。参数4指定传递给线程的单独的参数的值。参数5指定控制线程创建的附加标记。如果CREATE_SUSPENDED标记被指定,线程创建后处于暂停状态不会运行,直到调用了ResumeThread函数。 如果该值是0,线程在创建之后立即运行。参数6out指向一个变量用来接收线程的标识符。创建一个线程时,系统会为线程分配一个ID号。Windows NT/2000:如果这个参数是NULL,线程的标识符不会返回。Windows 95/98 :这个参数不能是NULL 如果线程创建成功,此函数返回线程的句柄。= 二、编写线程函数可参考ThreadProc:

12、DWORD WINAPI ThreadProc(LPVOID lpParameter);= 三、关闭线程句柄在主线程中创建完一个新线程之后,一般会调用CloseHandle()方法来关闭新创建的线程的句柄。BOOL CloseHandle(HANDLE hObject);注意:关闭句柄并没有终止新创建的线程,新建的线程继续在运行。至于为什么要关闭线程句柄,主要有两个原因:1.在本主线程中,这个句柄已经没什么用了。2.当关闭线程句柄时和创建的线程执行完毕之后,系统会递减新线程的内核对象使用计数,当使用计数为0时,系统就会释放线程内核对象;如果在主线程中没有关闭这个句柄,那么始终会保留这个引用,这样线程的内核对象的使用计数即使在创建的线程执行完毕之后也不会降为0,因此线程的内核对象无法释放,直到进程终止时系统才会清理这些残留的对象。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核对象的引用计数减1。=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号