2023年实验七Linux多线程编程实验报告.docx
《2023年实验七Linux多线程编程实验报告.docx》由会员分享,可在线阅读,更多相关《2023年实验七Linux多线程编程实验报告.docx(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验七:Linux多线程编程(4课时)实验目的:掌握线程的概念;熟悉Linux下线程程序编译的过程;掌握多线程程 序编写方法。实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪 些好处?什么的系统应当选用多线程?我们一方面必须回答这些问题。1多线程概念使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。 运营于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分 数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。使用多线程的理由之二是线程间方便的通信机制。同一进程下的线程之间共享数 据空间,所以一个线程的数据可以直接为其它线程所
2、用,这不仅快捷,并且方便。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(
3、 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
4、 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 E
5、M ;/*设立线程分离属性*/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);/*
6、释放线程属性对象*/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);第一个参数为被等待的线程标记符,第二个参数为一个用户定义的指针,
7、它可以 用来存储被等待线程的返回值。函数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,
8、这个函数必须在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进行存放,一般说来,我们
9、总是先取优先级,对取得的值修改 后再存放回去。4线程的数据解决和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭 的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。 我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同 时不能运营一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静 态变量经常带来问题,函数的返回值也会有问题。互斥锁互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假 设各个线程向同一个文献顺序写入数据,最后得到的结果一定是劫难性的。条件变量互斥锁一个明显的缺陷是它只有两种状态:锁定和非锁定。而
10、条件变量通过允许 线程阻塞和等待另一个线程发送信号的方法填补了互斥锁的局限性,它常和互斥 锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解 开相应的互斥锁并等待条件发生变化。信号量信号量既可以作为二值计数器(即0,1 ),也可以作为资源计数器.信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公 共资源增长时,调用函数sem_post()增长信号量。只有当信号量值大于。时, 才干使用公共资源,使用后,函数sem_wait ()减少信号量。函数s em_t r ywait ()和函数pthre a d_ m u t ex_try 1 o c k()起同
11、样的作用,它是函数 sem_wait()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc火.c -Ip t h r ea d-o1、完毕教材上th r ead.c的例子,想一下每次执行时结果相同吗,为什么? 答:每个线程的运营和结束时无序的、独立与并行的。实验代码:/* t h r ead.c */#in c lude #include #inclu d e #define THREAD_NUMBER 3 / * 线程数*/#def in e REPEAT_NUMBER 5 /*每个线程中的小任务数*/#define DEL aY_TIME_LEVELS 6. 0 /*小任务
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 实验 Linux 多线程 编程 报告
限制150内