2023年实验七Linux多线程编程实验报告_第1页
2023年实验七Linux多线程编程实验报告_第2页
2023年实验七Linux多线程编程实验报告_第3页
2023年实验七Linux多线程编程实验报告_第4页
2023年实验七Linux多线程编程实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验七:Linux多线程编程(4课时)实验目的:掌握线程的概念;熟悉Linux下线程程序编译的过程;掌握多线程程序编写方法。实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应当选用多线程?我们一方面必须回答这些问题。1多线程概念使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。运营于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。使用多线程的理由之二是线程间方便的通信机制。同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,并且方便。2多线程编程函数Linux系统下的多线程遵循POSIX线程接口,称为pth「ead。编写Linux下的多线程程序,需要使用头文献pthread.h,连接时需要使用库Iibpthread.a。pthread」在头文献/usr/include/bits/pthreadtypes.h中定义:typedefunsignedlongintpthread_t;它是一个线程的标记符。函数pthread_create用来创建一个线程,它的原型为:externintpthread_create((pthread_t*thread,constpthreadattrt*a11r,void*(*start_routine)(void*),void*arg));第一个参数为指向线程标记符的指针,第二个参数用来设立线程属性,第三个参数是线程运营函数的起始地址,最后一个参数是运营函数的参数。函数pth「ead_j。in用来等待一个线程的结束。函数原型为:externintpthread_join(pthread_tth,void**thread_rentmain(void)pthread_tthread:pthread_attr_tattr;intno=0,res:void*lhrd_ret;srand(time(NULL));/*初始化线程属性对象*/res=pthread_attrjnit(&attr);if(res!=0)(printf("Createattributefailed\n");exit(res);)/*设立线程绑定属性*/res=pthread_attr_setscope(&attr;PTHREAD_SC0PE_SYSTEM>;/*设立线程分离属性*/res+=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);if(res!=0)(printf("Settingattributefailed\n");exit(res);>res=pthread_create(&thread,&attr.thrd_func,NULL);if(res!=0)printf("CreatethreadfaiIed\n");exit<res);}/*释放线程属性对象*/pthread_attr_destroy(&attr);printf("Createtreadsuccess\n"):whi1e(!finish_fIag)(Printf("Waitingforthreadtofinish...\n"):sleep(2);)return0;4、完毕教材上多线程实验的实验内容。并分析程序的执行结果。实验总结:由运营结果可以看出,创建线程、释放资源按照顺序,而每个线程的运营和结束是独立与并行的。turn);第一个参数为被等待的线程标记符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。函数pthread_exit的函数原型为:externvoidpthread_exit(void*retval);唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_returno3修改线程的属性线程属性结构为pthread_attr_t,它在头文献/usr/inc1ude/pthread.h中定义。属性值不能直接设立,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。设立线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_SCOPESYSTEM(绑定的)和PTHREAD_SCOPE.PROCESS(非绑定的)。此外一个也许常用的属性是线程的优先级,它存放在结构sched_param中。用函数Pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。4线程的数据解决和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同时不能运营一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量经常带来问题,函数的返回值也会有问题。互斥锁互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文献顺序写入数据,最后得到的结果一定是劫难性的。条件变量互斥锁一个明显的缺陷是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法填补了互斥锁的局限性,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。信号量信号量既可以作为二值计数器(即0,1),也可以作为资源计数器.信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增长时,调用函数sem_post()增长信号量。只有当信号量值大于。时,才干使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_mutex_try1ock()起同样的作用,它是函数sem_wait()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc火.c-Ipthread-o1、完毕教材上thread.c的例子,想一下每次执行时结果相同吗,为什么?答:每个线程的运营和结束时无序的、独立与并行的。实验代码:/*thread.c*/#include<stdio.h>#include<sIdlib.h>#include<pthread.h>#defineTHREAD_NUMBER3/*线程数*/#defineREPEAT_NUMBER5/*每个线程中的小任务数*/#defineDELaY_TIME_LEVELS6.0/*小任务之间的最大时间间隔*/void*thrd_func(void*arg)〃指针好乱,这里看不懂定义了什么,求解择〃定义「一个返回值为指向空类型的指针的函数,该函数的参数为一个指针(/*线程函数例程*/1ntthrd.num=(int)arg;//这个是赋值吗?看不懂,求解释//定义了一个整型参数,取值为argintdelay_time=0;intcount=0;printf("Thread%disstarting\n",thrd_num);for(count=0;count<REPEAT_NUMBER;count++)《delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;Printf('\tThread%d:job%ddeIay=%d\n",thrd_num,count,deIay_time);sleep(de1ay_time);〃暂停?秒//暂停随机秒)//\t输出一个Tab占8列〃输出格式:Threadthrd_num:jobcountdelay=deIay_time【可车printf(MThread%dfinished\n",thrd_num):〃输出格式:Threadthrd_numfinished回车pthread_exit(NULL);)intmain(void){pthread_tthread[THREAD_NUMBER]://定义了一个类型为Pthread」的数组,数组元素的个数为3intno=0,res;void*thrd_ret;//这句什么意思?求解释〃定义了一个指针,指向哪里后面的程序里有。srand(time(NULL));〃这句什么意思?求解释〃用系统时间计算一个随机数。for(no=0;no<THREAD_NUMBER;no++){/*创建多线程*/res=pthread_create(&thread[no].NULL,thrd_func-(void*)no);//&thread[no]线程标记符//pthread_create函数的参数含义请看书。if(res!=0)〃创建线程犯错时res=错误码(printf("Createthread%dfailed\n•,no);exit(res);//上面的不是退出进程,而是判断pthread_create()函数是否成功执行。>)Printf("Createtreadssuccess\nWaitingforthreadstofinish...\n',):〃假如上面没退出进程,则创建线程成功for(no=0;no<THREAD_NUMBEK;no++){/*等待线程结束*/res=pthread_join(thread[no]r&thrd_ret>;//thread[no]线程标记符,此例总共有thread[O],thread[l]fIhread[2],3个线程〃清看书上pthread_join()函数的参数含义.if(Ires)//res=OBb挂起线程成功〃res=0时,说明pthread_Join()函数执行成功。printf("Thread%djoined\n",no);e1se(printf("Thread%djoinfailed\n",no);)}reiurn0:)2、完毕教材上thread_mutex.c例,查看运营情况。和上例比较有何不同,想一下为什么会出现这种差异?答:这里3个线程之间的运营顺序跟创建线程的顺序相同。include<stdio.h>include<std1ib.h>incIude<pthread.h>defineTHREAD_NUM3/*线程数*/#defineREPEAT_NUM3/*悠个线程的小任务数*/#defineDELAY_TIME_LEVELS6.0/*小任务之间的最大时间间隔*/pthread_mutex_tmutex;void*thrd_func(void*arg){intthrd_num=(int)arg;intdelay_time=0,count=0:intres:/*互斥锁上锁*/res=pthread_mutexJock(&mutex);if<res){printf("Thread%dlockfailed\n",thrd_num):pthrcad_exit(NULL);}printf("Thread%disstarting\n".thrd_num);for(count=0;Count<REPEAT_NUM:count++){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND.MAX))+1;sleep(deIay_timc);printf("\tThread%d:job%ddelay=%d\n",thrd_num,count,delay_time);)printf("Thread%dfinished\n"zthrd_num);pthread_mutex_unlock(&mutex);Pthread_exit(NULL);}intmain(void){pthread_tthread[THREAD_NUM];intno=0,res:void♦thrd_ret;srand(time(NULL));/*互斥锁初始化*/

pthrcad_mutex_init(&mutex,NULL);for(no=0;no<THREAD_NUM;no++){(void*)no);(void*)no);(void*)no);tofinish...\n");res=pthread_create(&thread[no],NULL,thrd_funif(res!=0)(void*)no);tofinish...\n");{printf("Createthread%dfaiIed\n",no);exit(res);})printf("Createtreadssuccess\nWaitingforthreadsfor(no=0;no<THREAD_NUM;no++){res=pthread_)oin(thread[no],&thrd_ret);if(!res){Printf("Thread%djoined\n".no):}eIse{oprintf("Thread%djoinfailed\n",no)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论