- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络软件技术 郭庆北 ise_guoqb@ujn.edu.cn 第一章 网络编程基础——多线程 1.多线程技术简介 2. 线程API 3. 线程对象操作 1.1 多线程技术简介 进程:是对一段静态指令序列(程序)的动态执行过程。 进程是系统进行资源分配和调度的基本单位 进程相关信息:用户标识、正在执行的已经编译好的程序、程序和数据在存储器中的位置等 线程:同一个进程又可以划分为若干个独立的执行流,称为线程。线程可以看作是进程的一个实例。在Windows环境下,用户可以同时运行多个应用程序,每个执行的应用程序就是一个进程。 线程是CPU调度和分配的基本单位 并发处理 为什么线程是网络编程的基础? 多线程带来如下好处: 1)避免瓶颈; 2)并行操作; 3)提高效率; 在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性。 另一方面,在多CPU系统中,可以把不同的线程在不同的CPU 中执行。 请注意:多线程不能滥用。 1.2 线程API 一、创建线程 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); lpThreadAttributes:指定安全参数,当前进程创建的进程(子进程)是否继承该句柄也由此参数确定,如不需控制可指定为NULL。 dwStackSize:线程的堆栈大小,以字节为单位,该值上取整到与其最接近的页面大小。如为0,则默认为调用线程的堆栈大小。 lpStartAddress:指向一个线程实际运行代码的函数指针,原型为DWORD WINAPI ThreadFunc(LPVOID data)。 lpParameter:传递给线程函数的数据值。 dwCreationFlags:创建标志,如创建后立即执行还是挂起。 lpThreadId:线程ID的地址。 二、终止线程 (1)Void ExitThread(DWORD dwExitCode) (2)线程函数ThreadFunc()退出。 (3)ExitThread会导致线程在清除构造器之前退出,因此不建议使用。 三、创建事件函数: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName); bManualReset:是否由程序员调用ResetEvent函数对创建的事件进行显式复位。 bInitialState:指定事件是否为激发状态。 lpName:事件的属性。 四、等待事件触发函数 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); hHandle:事件句柄。 dwMilliseconds :超时时间,为0则立即返回。 1.3 线程对象操作 一、线程的创建: MsgThread := TMsgThread.Create(False) ; //创建并执行线程 MsgThread := TMsgThread.Create(True) ; //创建线程后挂起 constructor Create(CreateSuspended: Boolean); 中的参数CreateSuspended表示创建后是否挂起线程 二、挂起线程: Suspend (把线程挂起的次数加一) 三、唤醒线程: Resume (注意:注意这个属性是把线程挂起的次数减一,当次数为0 时,即唤醒。也就是说,线程挂起多少次,唤醒也需要多少次。同时挂起的时候将保持线程的地址指针不变,所以线程挂起后再唤醒,将从挂起的地方开始运行) 四、线程的终止和退出: 1)自动退出: 一个线程从execute()过程中退出,即意味着线程的终止,此时将调用WINDOWS的exitthread()函数来清除线程所占用的堆栈。 如果线程对象的 freeonterminate 属性设为true,则线程对象将自动删除,并释放线程所占用的资源。 这是消除线程对象最简单的办法。 2)受控退出: 利用线程对象的terminate属性,可以由进程或者由其他线程控制线程的退出。只需要简单的调用该线程的terminate方法,并设直线程对象的terminate属性为true。 在线程中,应该不断
文档评论(0)