欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2023年实验七Linux多线程编程实验报告.docx

    • 资源ID:72740245       资源大小:21.99KB        全文页数:10页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

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

    2023年实验七Linux多线程编程实验报告.docx

    实验七:Linux多线程编程(4课时)实验目的:掌握线程的概念;熟悉Linux下线程程序编译的过程;掌握多线程程 序编写方法。实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪 些好处?什么的系统应当选用多线程?我们一方面必须回答这些问题。1多线程概念使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。 运营于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分 数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。使用多线程的理由之二是线程间方便的通信机制。同一进程下的线程之间共享数 据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,并且方便。2多线程编程函数Linux系统下的多线程遵循POSIX线程接口,称为p the a d。编写L i n ux 下的多线程程序,需要使用头文献pthread.h,连接时需要使用库I i bp t h r ead .a。pthread在头文献/us r/include/bi t s /p t h r ea d ty p es.h 中定义: typedef unsigned long i nt p t hrea d_ t;它是一个线程的标记符。函数pthre a d_c reat e用来创建一个线程,它的原型为:ext e rn i nt p t hread_create( p t hre a d_t * threa d , con s t pt h r ead a tt r t *a 11 r ,void * (*s t ar t _routin e ) ( v o i d *), void *arg);第一个参数为指向线程标记符的指针,第二个参数用来设立线程属性,第三个参 数是线程运营函数的起始地址,最后一个参数是运营函数的参数。函数pt he a d_j。in用来等待一个线程的结束。函数原型为:extern int p thread_ j o in(p t hread_ t t h , vo i d *thread_r en t main (void )p t h r ead_t t hread:pth r ead_attr_t a ttr;i n t n o = 0, res:void * l hrd_ r et;srand(t i me(NULL );/*初始化线程属性对象*/r e s = pth r ead_a t trjni t (&att r );if (r es ! = 0)(pri n tf("Cre a te att r ibu t e failedn");exit(re s );)/*设立线程绑定属性*/res = p th rea d_a t tr_set s c ope(&attr; PTHREAD_SC0PE_SYST EM> ;/*设立线程分离属性*/res += pth read_attr_setdetach st a t e(& a ttr, PTHREAD_CREATE_DETAC H ED);if (res ! = 0)(pr i ntf("S e t ti n g a ttribute fa i ledn ");e x it(res);>r e s = pt h re a d _c r eate(&thread, &attr. t hrd _fun c , NULL);if (res != 0)print f (" C rea t e thre a d fa i Ie d n");ex i t <re s);/*释放线程属性对象*/p thread_attr_des t roy (&a t tr);pri n t f(" Cre ate t r e ad su c ces s n"):whi 1 e (! f inish_f I ag)(P rint f ("Waiti n g fo r t h read t o f i nish. n"):sleep(2);)r eturn 0;4、完毕教材上多线程实验的实验内容。并分析程序的执行结果。实验总结:由运营结果可以看出,创建线程、释放资源按照顺序,而每个线程的运营和结束 是独立与并行的。turn);第一个参数为被等待的线程标记符,第二个参数为一个用户定义的指针,它可以 用来存储被等待线程的返回值。函数pth r ead_e xit的函数原型为:extern vo id pthread_exit(vo i d *re t val);唯一的参数是函数的返回代码,只要pthread_j oin中的第二个参数 thread_return 不是 NULL,这个值将被传递给 t hread_r e tu rno 3修改线程的属性线程属性结构为pth r ead_attr_t,它在头文献/usr/inc 1 u de / p t h r e ad. h中定义。属性值不能直接设立,须使用相关函数进行操作,初始化的函数 为p thr e ad_attr_i n it,这个函数必须在p thread_ c re a t e函数之前调用。 设立线程绑定状态的函数为p t hread_attr_setscope,它有两个参数,第 一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_ SCOPE SYSTE M(绑定的)和 PTHREAD_ S COPE.PROCES S (非绑定的)。 此外一个也许常用的属性是线程的优先级,它存放在结构s ched_param中。用 函数 P thread_ a t tr_ g etsche d param 和函数 pth r e a d_at t r_setschedp a ram进行存放,一般说来,我们总是先取优先级,对取得的值修改 后再存放回去。4线程的数据解决和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭 的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。 我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同 时不能运营一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静 态变量经常带来问题,函数的返回值也会有问题。互斥锁互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假 设各个线程向同一个文献顺序写入数据,最后得到的结果一定是劫难性的。条件变量互斥锁一个明显的缺陷是它只有两种状态:锁定和非锁定。而条件变量通过允许 线程阻塞和等待另一个线程发送信号的方法填补了互斥锁的局限性,它常和互斥 锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解 开相应的互斥锁并等待条件发生变化。信号量信号量既可以作为二值计数器(即0,1 ),也可以作为资源计数器.信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公 共资源增长时,调用函数sem_post()增长信号量。只有当信号量值大于。时, 才干使用公共资源,使用后,函数sem_wait ()减少信号量。函数s em_t r ywait ()和函数pthre a d_ m u t ex_try 1 o c k()起同样的作用,它是函数 sem_wait()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc火.c -Ip t h r ea d-o1、完毕教材上th r ead.c的例子,想一下每次执行时结果相同吗,为什么? 答:每个线程的运营和结束时无序的、独立与并行的。实验代码:/* t h r ead.c */#in c lude <stdio.h>#include <s I dlib.h>#inclu d e <pthr e ad.h>#define THREAD_NUMBER 3 / * 线程数*/#def in e REPEAT_NUMBER 5 /*每个线程中的小任务数*/#define DEL aY_TIME_LEVELS 6. 0 /*小任务之间的最大时间间隔*/ void *thrd_func(void *arg) 指针好乱,这里看不懂定义了什么,求解择定义一个返回值为指向空类型的指针的函数,该函数的参数为一个指针(/*线程函数例程 * /1 ntthrd.num = (int) a rg; /这个是赋值吗?看不懂,求解释/定义了一个整型参数,取值为argint d elay_t i me = 0 ;i nt count = 0;p r int f ("Th read %d is sta r t i ngn", th rd_n u m);fo r ( c ount = 0 ; count < REPEAT_NU MBER; c ount+)delay_time = ( i nt) (rand() * DELAY_T I ME_L EVELS/(RAN D_MAX) ) + 1;P r i ntf(' t Th read %d: j ob % d d e I a y = %dn", thrd_num, count, d e I a y _ t ime);sleep(de 1 ay_time); 暂停?秒/暂停随机秒)/ t输出一个T ab占8列输出格式:Thre a d thrd_num: job co u nt del a y = de I ay_time【可车pr i n t f(MThrea d %d fini s h e dn", th r d_n u m):输出格式:Thread th r d_num finished 回车pt h r e a d _exit (NULL);)int mai n (void)p t hread_t threadTHREAD_NUMBER:/定义了一个类型为P thread的数组,数组元素的个数为3int no = 0, res;void * thrd_ret; /这句什么意思?求解释定义了一个指针,指向哪里后面的程序里有。s r and(tim e (NULL); 这句什么意思? 求解释 用系统时间计算一个随机数。fo r (n o = 0; no < TH READ_NUM B ER; no+ + )/*创建多线程*/re s = p t hread_create (&threadno. NULL, t hrd_ f unc- ( vo i d*)no); /&th r ea d no 线程标记符/p t h read_creat e函数的参数含义请看书。if (res != 0) 创建线程犯错时r es=错误码(p rintf("C r e a t e t h re a d % d failed n , no);exi t ( res);/ /上面的不是退出进程,而是判断p t hread_create()函数是否成功执行。>)P rin t f(" C r e ate trea d s s ucce ssn Wa i t i ng for threads t o finish. n',):假如上面没退出进程,则创建线程成功for (no = 0; no < THREAD_NUMBE K ; n o+) / *等待线程结束*/r es = pthread_jo in(threa d nor &thrd_ret> ;/ thre a dno 线程标记符,此例总共有th r e a d O,threa dl f I hread 2 ,3个线程清看书上pth r ead_join ()函数的参数含义.if (Ires) / res = OBb挂起线程成功res=0时,说明pthrea d_Join ()函数执行成功。pr i ntf("Th read % d joinedn ", no);e 1 se(pr i nt f ("Thread %d join f ailedn", no);)re i urn 0:)2、完毕教材上thread_mu tex.c例,查看运营情况。和上例比较有何不同, 想一下为什么会出现这种差异?答:这里3个线程之间的运营顺序跟创建线程的顺序相同。# in c lude <stdio.h>incl u de <std 1 i b .h># inc I ude <pthread.h>defi ne THREAD_NUM 3 /* 线程数 */#def i n e REPEAT_NUM 3 /*悠个线程的小任务数*/#de fine DE LAY_TIME_LEVELS 6 .0/*小任务之间的最大时间间隔*/p th r e a d_mutex_ t mutex;voi d *thrd_ f unc (void *arg )int th r d_num = (i nt) a r g;int de lay_time = 0, count = 0:in t res:/*互斥锁上锁* /res = pthrea d _mute x Jock (&mu t e x);i f < res)prin t f ( " Thread % d lock fa iledn", th r d_n um):p t hrc ad_ex i t(NULL);print f ("Thread %d is s tartin gn". th rd_num);f o r (co u nt = 0; Co unt < REPEAT_NUM: co unt+ + ) d ela y _time = (int)( rand () * DELAY_TIME_LEVELS/ (RAND.MAX) ) + 1 ;sleep ( d e I a y_ t i m c );pr i n t f("tTh r e ad %d: job %d del a y = %dn",thrd_n um, count, del a y_time); )printf ("Thread %d fin i s hedn"z t hrd_nu m);p t h r ead_m ute x_unloc k (&mutex);P thread_exi t (NU L L);int main(vo i d ) p t h r ea d _t threa dTHREAD_NUM;int no = 0, r es: void thrd_ ret;srand(time (NULL);/*互斥锁初始化*/p t hrc ad_mute x_ i nit ( &mute x, NULL );f or (no = 0 ; no < THREAD_NUM; n o+)(vo id*)no);(vo id*)no);to finish.n");res = pthrea d _ c re a te (& thread no, NULL, th r d _fu n if (re s ! = 0 )print f ("Crea te thread %d fai I edn", no);e xi t (re s );)pr i nt f (" Crea tetr eads success n Waiting for thread s for(no= 0 ; n o <THRE AD_NUM; n o+ + )res = pthread_)oin(threadno,& t hrd_ret);i f (! r e s)P ri n t f("Thread %d joinedn". no):e Ise o p rin t f ("Thre a d %d joi n fa iled n " ,no);pthr e ad_mut e x_des t roy(&mut e x);return 0;3、完毕教材上thread_a t tr. c例子,并运营查看结果,然后和前面两个例子比较查看系统资源的差异。答:理论中线程在运营结束后就回收系统资源,并释放内存。程序代码:#incl u de < s tdio. h >i n c lude < s td 1 ib.h># i n c 1 ude <pth re a d . h>d efine REPEAT_NUMBER 3 /* 线程中的小任务数/# define DE L AY_TIME_LEVELS 1 0.0 /* 小任务之间的最大时间间隔*/i nt fini s h_ f 1 ag = 0;v oid *th r d _ f unc( v oid * a rg )(in t del a y_time = 0;int count = 0;P rintf ("T h read is s t a rting n");for ( c o unt = 0; co unt < REPEAT_NUMBER; c o u nt+)delay_time = ( i nt)( ran d () * DEL AY_TIM E_LEVELS/(RAND_MAX) + 1;sleep( <1 elay_time);p r int f ("tThrea d : job %d de 1 a y = %dn ", countz d ela y_tim e ); p r i n tf(" T hr e ad finishe d n");f i nish _fla g = 1;p t h read_exit(NULL);

    注意事项

    本文(2023年实验七Linux多线程编程实验报告.docx)为本站会员(太**)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开