网络程序设计-第六章.ppt
《网络程序设计-第六章.ppt》由会员分享,可在线阅读,更多相关《网络程序设计-第六章.ppt(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第6 6章章 WinsockWinsock的多线程编程的多线程编程WinSock为什么需要多线程编程为什么需要多线程编程6.1Win32操作系统下的多进程多线程机制操作系统下的多进程多线程机制6.2VC+6.0对多线程网络编程的支持对多线程网络编程的支持6.36.1.1 WinSock的两种输入输出模式的两种输入输出模式 n“阻塞”模式,又称为同步模式,执行I/O操作完成前会一直进行等待,不会将控制权交给程序,工作在“阻塞”模式的套接字称为阻塞套接字。l套接字默认为阻塞模式。l可以通过多线程技术进行处理。n“非阻塞”模式,又称为异步模式,执行I/O操作时,Winsock函数会返回并交出控制
2、权。工作在“非阻塞”模式下的套接字称为非阻塞套接字。l使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回WSAEWOULDBLOCK错误,但功能强大。2WinSock为什么需要多线程编程为什么需要多线程编程6.13l在大多数情况下,非阻塞模式调用都会失败,返回一个WSAEWOULDBLOCK错误,表示操作的条件尚不具备,但又不允许等待完成请求的操作。l非阻塞模式下会频繁返回错误,应仔细检查返回代码;并且在不成功的情况下不应反复轮询.n“非阻塞”模式6.1.2 两种模式的优缺点及解决方法两种模式的优缺点及解决方法n“阻塞”与“非阻塞”模式各有其优点和缺点。n阻塞套接字的I/O操作
3、工作情况比较确定,无非是调用、等待、返回。大部分情况下,I/O操作都能成功地完成,不过就是花费了等待的时间l因而比较容易使用,容易编程;l但在应付诸如需要建立多个套接字连接来为多个客户服务的时候,或在数据的收发量不均匀的时候,或在输入输出的时间不确定的时候,却显得性能低下,甚至无能为力。4n使用非阻塞套接字,需要编写更多的代码,因为必须恰当地把握调用I/O函数的时机,尽量减少无功而返的调用,还必须详加分析每个Winsock调用中收到的WSAEWOULDBLOCK错误,采取相应的对策。l这种I/O操作的随机性使得非阻塞套接字显得难于操作。n所以,我们必须采取一些适当的对策,克服这两种模式的缺点,
4、让阻塞和非阻塞套接字能够满足各种场合的要求。l对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”。l对于阻塞的套接字工作模式,则进一步引入了多线程机制。56.2.1 Win32 OS是单用户多任务的操作系统是单用户多任务的操作系统n最早的DOS是单用户单任务的。n后来发展到图形界面的Windows,发展到Windows 95,Windows 98,就都支持多任务了。n从Windows NT起,Windows操作系统更是发展成了一个真正的抢占式多任务操作系统。l一个运行中的应用进程实例,就是一个进程。l一个基于Win32的应用程序可以包含一个或多个进程。Win32操作系统下的多进程
5、多线程机制操作系统下的多进程多线程机制6.266.2.2 Win32 OS是支持多线程的操作系统是支持多线程的操作系统nWin32操作系统还支持同一进程的多线程。在一个Windows进程内,可以包含多个线程。n一个线程(thread)是进程内的一条执行路径,具体地说,是一个应用程序中的一条可执行路径,往往是应用程序中的一个或多个函数。n一个进程中至少要有一个线程,习惯将它称为主线程。n任何一个应用程序进程都有一个主线程。一般C程序中的Main或WinMain函数就规定了主线程的执行代码。786.2.2 Win32 OS是支持多线程的操作系统是支持多线程的操作系统n当你启动了一个应用程序时,操作
6、系统在为它创建了进程之后,也创建了该进程的主线程,并根据Main或WinMain函数的地址,开始执行该进程的主线程。n主线程可以创建并启动其他辅助线程。n由主线程创建的线程又可以创建并启动更多的线程。l线程的代码执行完毕时会自动终止,并将占用的资源释放给进程;l进程的所有线程都终止时,进程也就终止了,并会将占用的资源释放给操作系统。n一个线程需要占用一定的系统资源,一类是此线程专用的,另一类则是与进程的其他线程共享的。n线程是进程中相对独立的执行单位,也是Win32操作系统中可调度的最小的执行单位。n多个进程中的多个线程并发地执行。n对于拥有多个处理机的计算机系统,调度程序可以将不同的线程安排
7、到不同的处理机上去运行,一方面平衡了CPU的负载,另一方面也提高了系统的运行效率。96.2.2 Win32 OS是支持多线程的操作系统是支持多线程的操作系统6.2.3 多线程机制在网络编程中的应用多线程机制在网络编程中的应用n如果一个应用程序,有多个任务需要同时进行处理,那就最适合使用多线程机制。l对于网络上客户机软件,采用多线程的编程技术,能克服在单线程的编程模式下,由于阻塞等待而产生的客户程序就不能及时响应用户的操作命令的问题。n利用Windows系统的多线程机制可以很好的解决这个问题。l将用户界面的处理放在主线程中,将数据的I/O、费时的计算、网络访问等放在辅助线程里。1011n网络上服
8、务器软件应采用多线程的编程技术。网络上服务器软件应采用多线程的编程技术。l能更好地为多个客户服务。l可以执行许多后台处理,如数据库访问、安全验证、日志记录、事物处理等。n客客户户机机软软件件,采采用用多多线线程程机机制制也也能能大大大大提提高高应应用程序的运行效率。用程序的运行效率。l如东方快车、网络蚂蚁等文件下载软件,就采用了多线程机制,用多个线程同时下载一个文件的不同部分,大大加快了下载速度。n总之,多线程机制在网络编程中是大有作为总之,多线程机制在网络编程中是大有作为的。的。6.2.3 多线程机制在网络编程中的应用多线程机制在网络编程中的应用 VC+6.0为程序员提供了Windows应用
9、程序的集成开发环境,在这个环境下,有两种开发程序的方法。既可以直接使用Win32 API来编写C风格的Win32应用程序,也可以利用MFC基础类库编写C+风格的应用程序。在这两种Windows应用程序的开发方式下,多线程的编程原理是一致的。12VC+6.0对多线程网络编程的支持对多线程网络编程的支持6.36.3.1 MFC支持的两种线程支持的两种线程 微软的基础类库MFC提供了对于多线程应用程序的支持。在MFC中,线程分为两种,一种是用户接口线程(user-interface thread),或称用户界面线程;另一种是工作线程(the worker thread),这两类线程可以满足不同任务的
10、处理需求。131用户接口线程用户接口线程 用户接口线程通常用来处理用户输入产生的消息和事件,并独立地响应正在应用程序其它部分执行的线程产生的消息和事件,MFC特别地为用户接口线程提供了一个消息泵(a message pump)。用户接口线程包含一个消息处理的循环,以应对各种事件。在MFC应用程序中,所有的线程都是由CWinThread对象来表示的。CWinThread类(可以理解为C+的Windows 线程类)是用户接口线程的基类,CWinApp就是从CWinThread类派生出来的,我们在编写用户接口线程的时候,也需要从CWinThread类派生出自己的线程类,借助ClassWizard可以
11、很容易地做这项工作。142工作线程工作线程 工作线程(the worker thread),适用于处理那些不要求用户输入并且比较消耗时间的其他任务。对用户来说,工作线程运行在后台。这就使得工作线程特别适合去等待一个事件的发生。CWinThread类同样是工作线程的基类,同样是由CWinThread对象来表示的。但在编写工作线程的时候,你甚至不必刻意地从CWinThread类派生出自己的线程类对象。你可以调用MFC框架的AfxBeginThread帮助函数,它会为你创建CWinThread对象。156.3.2 创建创建MFC的工作线程的工作线程 下面介绍利用MFC创建工作线程所必需的步骤。创建一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络程序设计 第六
限制150内