欢迎来到优知文库! | 帮助中心 分享价值,成长自我!
优知文库
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 优知文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    第9章、多线程编程.docx

    • 资源ID:1751872       资源大小:60.31KB        全文页数:22页
    • 资源格式: DOCX        下载积分:7金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录
    二维码
    扫码关注公众号登录
    下载资源需要7金币
    邮箱/手机:
    温馨提示:
    快捷下载时,如果您不填写信息,系统将为您自动创建临时账号,适用于临时下载。
    如果您填写信息,用户名和密码都是您填写的【邮箱或者手机号】(系统自动生成),方便查询和重复下载。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第9章、多线程编程.docx

    第9举多线程编程本章0标在前两章中.读者主要学习了有关进程控制和进程间通信的开发,这些都是UnUX开发的根底.在这一章中将学习轻最线进程战程的开发,由于线程的高效性和可操作性,在大型程序开发中运用得非常.广泛,带望读者能够很好地掌握.掌握1.inux中线程的根本概念口拿握1.inUX中线程的创立及使用U掌1.inux中线在属住的设五1.J能够以立场写多蛾程程序1.1.9.1 1.inUX线程概述线程概述前面已经提到,进程是系统中程序执行和资源分配的根本单位。得个进程都拥行自己的数据段、代码段和堆枝段.这就造成了进程在进行切换等操作时挪需要彳f比拟熨杂的上下文切换等动作.为了进一步就少处理机的空转时间,支持多处理涔以及或少上下文切换开销,进程在演化中出现了另一个概念线程。它是进程内独立的一条运行路线,处理潜调度的最小单元也可以称为轻量级进程.线程可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享.因此,级程的上下文切换的开销比创立进程小很多。同进程一样,线程也将相关的执行状态和存储变域放在线程控制表内.一个进程可以有多个线程,也就是有多个线程控制表及堆栈存放器.但却共享一个刖户地址空间.要注意的是由于线程共享了进程的资源和地址空间,因此,任何战程对系统资源的操作都会给其他规程带来影响。由此可知,多线;程中的同步是非常界要的问题。在多战程系统中,进程与进程的关系如图9所示.图9.1进程与我桂关系线程机制的分类和特性双程按照其时度拧可以分为用户级线程和核心级线程两种-(I)用户级规程。用户级战程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定.在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的税程诲,该线程际提供了践程的创立、调度和微错等功能,而内核仍然仅对进程诳行管理。如果一个进程中的某一个战程调用了一个阻塞的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞.这种用户级线程的主要缺点是在一个诳程中的多个线程的调度中无法发挥多处埋器的优势.(2)轻埴奴进程。轻量级进程是内核支持的用户线程,是内核线程的一种抽象对我.每个线程拥有一个或多个轻疑被税程,而每个轻量级线程分别被绑定在一个内核战程上。内核战程。这种线程允许不同进程中的线程按照同一相时优先调度方法进行两度,这样就可以发挥多处理器的并发优势.现在大多数系统都采用用户级战程与核心级战程并存的方法。一个用户级线程Ur以对应一个或几个核心级线程,也就是“一对一”比“多对一”模型.这样既可满足多处理机系统的需要也可以最大限度地战少两度开销.使用战程机制大大加快上下文切换速度而且节省很多资源,但是因为在用户态和内核态均要实现询度管抻,所以会增加实现的更公度和引起优先级朝转的可能性.一个多线程程序的同步设计与调试也会增加程序实现的难度”9.2 1.inUX线程编程线程根本编程这里要讲的线程相关操作都是用户空间中的规程的操作.在1.inux中,一般Pthread线程库是一套通用的规程阵,是由POSIX提出的,因此具有很好的可移植性.(1)函数说明.创立规程实际上就是确定调用该线程函数的入口点,这里通例使用的函数是P1.hrea1.Crea在践程创立以后,就开始运行相关的戏程函数,在该函数运行完之后,该线程也就退出了.这也是战程退出一种方法.另一种退出线程的方法是使用的数p<hrcadxit,这是线程的主动行为.这里要注意的是,在使用线程函数时,不能K1.意使用cxit()退出函数进行H1.错处理,由于exit。的作用是使调用进程终止,往往一个进程包含多个战程,因此,在使用exi之后,该进程中的所有线程都终止了.因此,在线程中就可以使用PthEM1.eXiIo来代替进程中的cxit().由于一个进程中的多个规程是共享数据段的,因此通常在线程退出之后,退出找程所占用的资源并不会髓者战程的终止而得到拜放,正如进程之间可以用Wai1.o系统调用来同步终止并释放资源样,线程之间也有类似机制,那就是P1.hrCadJoin()函数.P1.hrCadjoin(>可以用于将当前线程拄起来等待规程的结束.这个函数是一个规程阻我的函数,调用它的函数将一直等待到被簪待的代程结束为止,当南救返回时,被等待线程的资源就被收回。前面已提到线程调用pthreadfXitO函数主动终止自身线程.但是在很多线程应用中,羟常会遇到在别的线程中要终止另一个线程的执行的何时。此时调用Pthrea1.CanCe1.o函数实现这种功能,但在被取消的线程的内部需要调用Pthtra1.scICaneC1()函数和p<hrea1.sCICanCdIyPC()的数设置自己的取消状态,例如被取消的线程接收到另一个线程的取消请求之后,是接受还是忽略这个请求:如果接受.是立刻进行终止操作还是等待某个函数的调用等.(2)函数格式。表9.1列;I;/PthrCad_crcatc()函数的谱法要点.表。PthrWUI_CrVat«0由S1.t语法要点所需央文件inc1.ude<p1.hrc;id.h>ft5!ui1.P1.hiYac1.crvaM(p1.htuad,1.thread,pciuvad.a(1.rJ4a1.1.r.void*(tstat.rcHJi)(x)id*).void*arg>>由政传入Ihrsdr规程标识符Jftaiir:(共区体设JH参见小节),为常取为NU1.1.'Urt/uutine:找程雨数的起始地址.是一个以指向vuid的指针作为警致和返H1.ft的函数指针I1.rgIi2Ma11.roinc(Kft-IaiSiSI成功20(ft出楮:返回错限码表9.2列IH了P1.hrCad_exi1.()函数的语法要点。表9.2PthrVad_e、it()函数语法妾点所格头文件Windude<Mhread.h>函数原型Voidpthrc;wi_cxit(wid*c1.va1.)Ffi8(传入位revah线和给束时的iM"(i1.Id1.HttjFfitttaP1.hreHdJoEO来获取表93列出了P1.hreadjoi110函数的语法要点。表。与pdEdJinO函效语法要点所需为文件*inc1.udc<thcad.h>in(PthrcJcin(pthrcjth.Veid*thrcnd.reium)th等待线程的标识符函数传入值thicadjCtUm:用户定义的折计,用来存储被等特级利结束时的返H1.W(不为Nu1.1.时)的散返同伙成爪0btft返回错误码ii9.4列出了PthrCa1.CanCdo函数的语法要点.表0”,Pt1.MTX1.mc*T()函数诘法要点所需头文件析IKhKfc<pchrcod.h>的致原案intphrcad-cact<p<hrcudjth)函数传入值h)要取消的线程的标识符函数返回成功I0(ftH1.ffi1.返回错误码(3)函数使用.以下实例中创立了3个战程,为了更好地描述燃程之间的并行执行,让3个战程重用同一个执行函数。每个线程都有S次循环(可以存成5个小任务),每次循环之间会随机等待I-IoS的时间意义在于模拟每个任分的到达时间是时机的,并没仔任何特定规律./*thread.c*/inc1.ude<stdio.h>inc1.ude<std1.1.b.>!inc1.ude<pthread.h>”战.程金、/每个慢程中的小任务数“小任务之间的最大defineTHE<EAD_NUMBER3!defineREPEAT_NUMBER5./defineDEIY-TIME-1.ErE1.S10.0时向何喝*/voidthrd-fnc(voidwarg)(八线程居效例程/intthrd_nuni-(int)arg;intde1.ay_ti.me三0;intcount=0;printtnread9dis8tartingnthrd_num>for<count-0;count<REPEATNUMBER;countde1.ay-ti-<intj<rand11*DE1.AY_TIME_1.EVE1.SZ<RND-MX)÷1;s1.eep(de1.ay-tme1.;rintfwtThreadW:job*dde1.ay-1.dn-zthrd_num,count,de1.ay_time);)rintf1.,Tread、dCinishednM,thrd_num>;pthread_cxit(NU1.1.);)intEoirHvoidI(pthread-tthrcad(THREAD_NUMB£R;intno-Orres;voidthrd-ret;8rand(tire(NU1.1.>);for<no-0;no<THREAD-NUMBER;no)(/A锁立多线程-/espthreadcreate(6threadnozNU1.1.,trdefuncf(void*)no);ifres!-O)(rintfIwCreatethread%dta1.1.edn,fno);exit<res);)rintf("CreatetreadssuccessXnWaitingforthreadstofinish.n->for<no-O;no<THREAD_NUMBER;no+)(等待我程结束7res=pthxead_join(threadno,fithrd_ret);if(!res)(printfI"Threadtd)oinedn,zno>)e1.se<rintf1.,Thread、d:oinfai1.ednw,no);returnO;以下是程序运行结果,可以看H1.绿个战程的运行和结束是独立与并行的。S./threadCreatetreadssuccessWaitingforthreadstofinish.ThreadOisstartingThreadThread1isstarting2isstartingThread1:jobOde1.ay.6Thread2:jobOde1.ayM6ThreadO:JobOde1.ay9Thread1:job1de1.ay6Thread2:job1de1.ayarBThreadO:job1de1.ay8Thread2:Job2de1.ayB3ThreadO:job2de1.ay3Thread2:job3de1.ayW3ThreadThread2:job42finishedde1.ay=1Thread1:Job2de1.ay10Thread1:job3de1.ay.4ThreadThread1:job41finishedde1.ay=1ThreadO:job3de1.ayB9ThreadThreadO:

    注意事项

    本文(第9章、多线程编程.docx)为本站会员(王**)主动上传,优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知优知文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 yzwku网站版权所有

    经营许可证编号:宁ICP备2022001189号-2

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知优知文库网,我们立即给予删除!

    收起
    展开