实验七:Linux多线程编程

上传人:橙** 文档编号:333366024 上传时间:2022-09-01 格式:PDF 页数:7 大小:95.28KB
返回 下载 相关 举报
实验七:Linux多线程编程_第1页
第1页 / 共7页
实验七:Linux多线程编程_第2页
第2页 / 共7页
实验七:Linux多线程编程_第3页
第3页 / 共7页
实验七:Linux多线程编程_第4页
第4页 / 共7页
实验七:Linux多线程编程_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验七:Linux多线程编程》由会员分享,可在线阅读,更多相关《实验七:Linux多线程编程(7页珍藏版)》请在金锄头文库上搜索。

1、实验七:Linux多线程编程(4 课时)实验目的:掌握线程的概念;熟悉Linux下线程程序编译的过程;掌握多线程程序编写方法。实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。1 多线程概念使用多线程的理由之一是和进程相比,它是一种非常节俭的多任务操作方式。运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。使用多线程的理由之二是线程间方便的通信机制。同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快

2、捷,而且方便。2 多线程编程函数Linux 系统下的多线程遵循POSIX 线程接口,称为 pthread。编写 Linux 下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedef unsigned long intpthread_t;它是一个线程的标识符。函数 pthread_create用来创建一个线程,它的原型为:extern intpthread_create(pthread_t*thread,constpthread_attr_t*att

3、r,void*(*start_routine)(void*),void*arg);第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。函数 pthread_join用来等待一个线程的结束。函数原型为:extern intpthread_join(pthread_tth,void*thread_return);第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。函数 pthread_exit的函数原型为:extern void pthread_exit(void*retval

4、);唯 一 的 参 数 是 函 数 的 返 回 代 码,只 要pthread_join中 的 第 二 个 参 数thread_return不是 NULL,这个值将被传递给thread_return。3 修改线程的属性线程属性结构为pthread_attr_t,它在头文件/usr/include/pthread.h中定义。属性值不能直接 设置,须 使用相 关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。设置线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是 指 向 属 性 结 构 的 指

5、 针,第 二 个 是 绑 定 类 型,它 有 两 个 取 值:PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。另外一个可能常用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。4 线程的数据处理名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 7 页 -和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,

6、可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量常常带来问题,函数的返回值也会有问题。互斥锁互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。条件变量互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程

7、往往解开相应的互斥锁并等待条件发生变化。信号量信号量既可以作为二值计数器(即 0,1),也可以作为资源计数器.信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数 pthread_ mutex_trylock()起同样的作用,它是函数 sem_wait()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc*.c-lpthread-o 1、完成教材上 thread.c的例子,想一下每次执行时

8、结果相同吗,为什么?答:每个线程的运行和结束时无序的、独立与并行的。实验代码:/*thread.c*/#include#include#include#define THREAD_NUMBER 3/*线程数*/#define REPEAT_NUMBER 5/*每个线程中的小任务数*/#define DELAY_TIME_LEVELS 6.0/*小任务之间的最大时间间隔*/void*thrd_func(void*arg)/指针好乱,这里看不懂定义了什么,求解释/定义了一个返回值为指向空类型的指针的函数,该函数的参数为一个指针/*线程函数例程*/intthrd_num=(int)arg;/这个是赋

9、值吗?看不懂,求解释/定义了一个整型参数,取值为arg intdelay_time=0;int count=0;printf(Thread%d is startingn,thrd_num);for(count=0;count REPEAT_NUMBER;count+)delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)+1;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 7 页 -printf(tThread%d:job%d delay=%dn,thrd_num,count,delay_time);sleep(delay_tim

10、e);/暂停?秒/暂停随机秒/t 输出一个 Tab 占 8 列/输出格式:Thread thrd_num:job count delay=delay_time回车printf(Thread%d finishedn,thrd_num);/输出格式:Thread thrd_num finished 回车pthread_exit(NULL);int main(void)pthread_t threadTHREAD_NUMBER;/定义了一个类型为pthread_t的数组,数组元素的个数为3 int no=0,res;void*thrd_ret;/这句什么意思?求解释/定义了一个指针,指向哪里后面的程

11、序里有。srand(time(NULL);/这句什么意思?求解释/用系统时间计算一个随机数。for(no=0;no THREAD_NUMBER;no+)/*创建多线程*/res=pthread_create(&threadno,NULL,thrd_func,(void*)no);/&threadno线程标识符/pthread_create函数的参数含义请看书。if(res!=0)/创建线程出错时res=错误码 printf(Create thread%d failedn,no);exit(res);/上面的不是退出进程,而是判断pthread_create()函数是否成功执行。printf(C

12、reate treads successn Waiting for threads to finish.n);/如果上面没退出进程,则创建线程成功for(no=0;no THREAD_NUMBER;no+)/*等待线程结束*/res=pthread_join(threadno,&thrd_ret);/threadno线程标识符,此例总共有thread0,thread1,thread2,3 个线程/请看书上 pthread_join()函数的参数含义。if(!res)/res=0时,挂起线程成功/res=0时,说明 pthread_join()函数执行成功。printf(Thread%d joi

13、nedn,no);else 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 7 页 -printf(Thread%d join failedn,no);return 0;2、完成教材上 thread_mutex.c例,查看运行情况。和上例比较有何不同,想一下为什么会出现这种差异?答:这里 3 个线程之间的运行顺序跟创建线程的顺序相同。#include#include#include#define THREAD_NUM 3/*线程数*/#define REPEAT_NUM 3/*每个线程的小任务数*/#define DELAY_TIME_LEVELS 6.0/*小任务之间的最大时间

14、间隔*/pthread_mutex_tmutex;void*thrd_func(void*arg)intthrd_num=(int)arg;intdelay_time=0,count=0;int res;/*互斥锁上锁*/res=pthread_mutex_lock(&mutex);if(res)printf(Thread%d lock failedn,thrd_num);pthread_exit(NULL);printf(Thread%d is startingn,thrd_num);for(count=0;count REPEAT_NUM;count+)delay_time=(int)(r

15、and()*DELAY_TIME_LEVELS/(RAND_MAX)+1;sleep(delay_time);printf(tThread%d:job%d delay=%dn,thrd_num,count,delay_time);printf(Thread%d finishedn,thrd_num);pthread_mutex_unlock(&mutex);pthread_exit(NULL);int main(void)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 7 页 -pthread_t threadTHREAD_NUM;int no=0,res;void*thrd_r

16、et;srand(time(NULL);/*互斥锁初始化*/pthread_mutex_init(&mutex,NULL);for(no=0;no THREAD_NUM;no+)res=pthread_create(&threadno,NULL,thrd_func,(void*)no);if(res!=0)printf(Create thread%d failedn,no);exit(res);printf(Create treads success n Waiting for threads to finish.n);for(no=0;noTHREAD_NUM;no+)res=pthread_join(threadno,&thrd_ret);if(!res)printf(Thread%d joinedn,no);else printf(Thread%d join failedn,no);pthread_mutex_destroy(&mutex);return 0;3、完成教材上 thread_attr.c 例子,并运行查看结果,然后和前面两个例子比较查看系统资源的差异。答:理论中线程

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号