您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 网络程序设计-08-WinSock多线程编程v1.0.0
WinSock多线程编程《网络程序设计》2回顾:WSAEventSelect模型将套接字绑定到事件对象,当套接字有网络事件发生时,对应的事件对象变为受信状态,然后从受信的事件对象中获取网络事件详情,并对网络事件进行处理。网络事件Socket对象网络事件Event对象WSAEventSelect绑定Event对象集合Socket对象Socket对象Event对象Event对象WSAEventSelect绑定WSAEventSelect绑定网络事件......Socket对象集合获取受信的Event对象获取具体的网络事件(如FD_READ等)WSAWaitForMultipleEventsWSAEnumNetworkEvents处理网络事件3WinSock多线程编程-引入解决阻塞问题——使用多线程处理或使用非阻塞模式非阻塞模式编程复杂,Winsock提供了一系列的I/O模型来简化非阻塞模式编程。前几次课我们已经学习了Select模型、WSAAsyncSelect模型和WSAEventSelect模型。本次课我们学习如何使用多线程机制处理阻塞问题。4WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践5WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践61.多线程概述简单的说,进程是应用程序的执行实例,线程是进程内部的一个执行单元。每个进程至少有一个主执行线程,通常以main/WinMain函数为入口点,主线程由系统自动创建。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。每个线程有自己的入口函数,由用户创建和指定。71.多线程概述多线程可以实现并行处理,避免了某项任务长时间占用CPU时间,也使得CPU被充分利用。在单处理器(CPU)环境下,如果两个非常活跃的线程为了抢夺CPU控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。81.多线程概述Win32SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。VC6中,MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。9WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践102.Win32API对多线程编程的支持Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作,重要的函数如下。(1)HANDLECreateThread(..)该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。(2)DWORDSuspendThread(HANDLEhThread)该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。112.Win32API对多线程编程的支持(3)DWORDResumeThread(HANDLEhThread)该函数用于结束线程的挂起状态,执行线程。(4)VOIDExitThread(DWORDdwExitCode)该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。122.Win32API对多线程编程的支持(5)BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode)一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。其不释放线程所占用的资源,一般不建议使用该函数。(6)BOOLPostThreadMessage(..)该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。13WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践143.CreateThread函数HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);如果创建线程成功则返回线程的句柄,否则返回NULL。lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了线程的安全属性,一般置为NULL;dwStackSize:指定了线程的堆栈深度,一般都设置为0;153.CreateThread函数HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为DWORDWINAPIThreadProc(LPVOIDlpParameter),ThreadProc是线程函数名;lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;163.CreateThread函数HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;lpThreadId:该参数返回所创建线程的ID.17WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践184.WinSock多线程编程示例5.1修改单线程服务器程序为多线程将前期课程的单线程服务器程序修改为多线程实现。5.2测试程序使用以前编写的TCP客户端程序进行连接/通信测试,观察运行效果。19WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践205.WinSock多线程编程小结(1)线程相关概念进程是应用程序的执行实例,线程是进程内部的一个执行单元。每一个进程至少有一个主执行线程,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间,也使得CPU被充分利用。215.WinSock多线程编程小结(2)Win32API对多线程编程的支持Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。具体函数包括:HANDLECreateThread(..);DWORDSuspendThread(HANDLEhThread);DWORDResumeThread(HANDLEhThread);VOIDExitThread(DWORDdwExitCode);BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);BOOLPostThreadMessage(..)225.WinSock多线程编程小结(3)WinSock多线程编程一连接一线程编程,模式简单,易于实现。关键点:创建线程、撰写线程函数ThreadProc()、注意参数类型转换;235.WinSock多线程编程小结问题:并发量大时,连接数过多,占用系统资源过多或连接数超限!解决:1.即时关闭不活动的socket,即时终止不使用的线程。2.将多线程和I/O模型结合使用,在一个线程中处理多个套接字。说明:完成端口模型即是将多线程和I/O模型结合使用的典型,其处理效率也是所有I/O模型中最高的。24WinSock多线程编程1.多线程概述2.Win32API对多线程编程的支持3.CreateThread函数4.Winsock多线程编程示例5.小结6.动手实践256.动手实践动手实践环节(1)认真阅读、分析、理解示例中的TCP服务器代码;(2)修改并测试代码,要求服务器监听8012端口,服务器收到信息后进行显示,并发送“你好,我是多线程服务器!”给客户端。(3)让邻座的同学使用客户端连接你的服务器,进行测试。26课后作业1.简述进程与线程的概念、区分。2.简述多线程的优点、缺点。3.请描述CreateThread()函数的功能,并解释其参数和返回值的意义。4.简要描述CreateThread,SuspendThread,ResumeThread,ExitThread,TerminateThread,PostThreadMessage函数的功能。网络程序设计谢谢!
本文标题:网络程序设计-08-WinSock多线程编程v1.0.0
链接地址:https://www.777doc.com/doc-3353495 .html