


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验七:Linux多线程编程(实验 报告)作者:日期:实验七:Linux多线程编程(4课时)实验目的:掌握线程的概念;熟悉 Linux下线程程序编译的过程;掌握多线程 程序编写方法。实验原理:为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪 些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。1多线程概念使用多线程的理由之一是和进程相比,它是一种非常 "节俭"的多任务操作方式。 运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间, 共享大部分 数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。使用多线程的理由之二是线程间方便的通信机
2、制。同一进程下的线程之间共享数 据空间,所以一个线程的数据可以直接为其它线程所用, 这不仅快捷,而且方便。 2多线程编程函数|-Linux系统下的多线程遵循POSIX线程接口,称为pthread 。编写Linux下的 多线程程序,需要使用头文件 pthread.h ,连接时需要使用库libpthread.a 。pthread_t 在头文件 /usr/i nclude/bits/pthreadtypes.h中定义:typedef un sig ned long int pthread_t;它是一个线程的标识符。函数pthread_create用来创建一个线程,它的原型为:extern int p
3、thread_create(pthread_t *thread, const pthread_attr_t*attr ,void *(*start_routine) (void *), void *arg);第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参 数是线程运行函数的起始地址,最后一个参数是运行函数的参数。函数pthread_join用来等待一个线程的结束。函数原型为:extern int pthread _joi n(pthread_t th, void *thread_return);第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以 用来
4、存储被等待线程的返回值。函数pthread_exit的函数原型为:exter n void pthread_exit(void *retval);唯一的参数是函数的返回代码,只要pthread_join 中的第二个参数 thread_return 不是 NULL,这个值将被传递给 thread_return 。3修改线程的属性一线程属性结构为pthread_attr_t ,它在头文件/usr/include/pthread.h中定义。属性值不能直 接设置,一须使用相关函数进行 操作,初始化的函 数为 pthread_attr_init ,这个函数必须在pthread_create 函数之前调用
5、。设置线程绑定状态的函数为pthread_attr_setscope ,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值: PTHREAD_SCOPE_SYSTEM (绑定的)和 PTHREAD_SCOPE_PROCESS (非 绑定的)。另外一个可能常用的属性是线程的优先级,它存放在结构sched_param 中。用 函 数 pthread_attr_getschedparam和 函 数pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。4线程的数据处理和进程相比,线程的最大优点之一是数据的共享性,
6、各个进程共享父进程处沿袭 的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同 时不能运行一个函数的多个拷贝(除非使用不同的数据段) 。在函数中声明的静 态变量常常带来问题,函数的返回值也会有问题。互斥锁互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。条件变量互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许 线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件
7、变量被用来阻塞一个线程,当条件不满足时,线程往往 解开相应的互斥锁并等待条件发生变化。信号量信号量既可以作为二值计数器(即0,1),也可以作为资源计数器.信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数 sem_post ()增加信号量。只有当信号量值大于0 时,才能使用公共资源,使用后,函数sem_wait ()减少信号量。函数sem_trywait ()和函数 pthread_ mutex_trylock ()起同样的作用,它是 函数sem_wait ()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc *.c -Ipthrea
8、d -o1、完成教材上thread.c的例子,想一下每次执行时结果相同吗,为什么? 答:每个线程的运行和结束时无序的、独立与并行的。实验代码:/* thread.c */#include <stdio.h>#include <stdlib.h> |#include <pthread.h>#define THREAD_NUMBER 3 /* 线程数 */#defi ne REPEAT_NUMBER 5 /*每个线程中的小任务数 */#defi ne DELAY_TIME_LEVELS 6.0 /*小任务之间的最大时间间隔 */void *thrd_fu nc(
9、void *arg) /指针好乱,这里看不懂定义了什么,求解释/定义了一个返回值为指向空类型的指针的函数,该函数的参数为一个指针 /*线程函数例程*/int thrd_ num = (in t)arg; /这个是赋值吗?看不懂,求解释/定义了一个整型参数,取值为argint delay_time = 0;int count = 0;printf("Thread %d is starting'n", thrd_num);for (count = 0; count < REPEAT_NUMBER; count+)delay_time = (in t)(ra nd(
10、) * DELAY_TIME_LEVELS/(RAND_MAX) + 1;printf("tThread %d: job %d delay = %dn",thrd_num, count, delay_time);sleep(delay_time); / 暂停?秒/暂停随机秒/t输出一个Tab占8列|/ 输出格式 : Thread thrd_num: job count delay = delay_time回车pr in tf("Thread %d fini shedn", thrd_ num);/ 输出格式: Thread thrd_num finish
11、ed回车pthread_exit(NULL);int main(v oid)pthread_t threadTHREAD_NUMBER;/定义了一个类型为pthread_t的数组,数组元素的个数为3int no = 0, res; |void * thrd_ret; /这句什么意思?求解释/定义了一个指针,指向哪里后面的程序里有。sran d(time(NULL); /这句什么意思?求解释/用系统时间计算一个随机数。for (no = 0; no < THREAD_NUMBER; n o+)/*创建多线程*/res = pthread_create(&thread no, NUL
12、L, thrd_fu nc, (void*) no); /&thread no线程标识符/pthread_create函数的参数含义请看书。if (res != 0) /创建线程出错时res=错误码pri ntf("Create thread %d failedn", no);exit(res);/上面的不是退出进程,而是判断pthread_create ()函数是否成功执行。pri ntf("Create treads successn Wait ing for threads to fin ish. n“);|/如果上面没退出进程,则创建线程成功for
13、 (no = 0; no < THREAD_NUMBER; n o+)/*等待线程结束*/res = pthread_j oin( thread no, & thrd_ret);/ threadno线程标识符,此例总共有 thread0 ,thread1 ,thread2 , 3 个线程 / 请看书上 pthread_join()函数的参数含义。if (!res) /res=0 时,挂起线程成功/res=0 时,说明pthread_join ()函数执行成功。prin tf("Thread %d joi nedn", no);else |printf(&quo
14、t;Thread %d join failed'n", no);return 0;|2、完成教材上thread_mutex.c 例,查看运行情况。和上例比较有何不同, 想一下为什么会出现这种差异?答:这里3个线程之间的运行顺序跟创建线程的顺序相同。#include <stdio.h>|#include <stdlib.h>|#include <pthread.h>#define THREAD_NUM 3 /* 线程数 */#define REPEAT_NUM 3 /*每个线程的小任务数 */#define DELAY_TIME_LEVELS
15、 6.0 /*小任务之间的最大时间间隔*/pthread_mutex_t mutex;void *thrd_func(void *arg)int thrd_num = (int)arg;int delay_time = 0, count = 0;int res;/*互斥锁上锁*/res = pthread_mutex_lock(&mutex);if(res) |printf("Thread %d lock failed'n", thrd_num);pthread_exit(NULL);printf("Thread %d is starting
16、9;n", thrd_num);for(count = 0; count < REPEAT_NUM;count+)delay_time = (int)(rand() * 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 (&
17、mutex);pthread_exit(NULL);int main(void) pthread_t threadTHREAD_NUM;int no = 0, res;void * thrd_ret;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("Creat
18、e thread %d failed'n", no);|exit(res);printf("Create treads success n Waiting for threads to finish.n");for(no=0; no<THREAD_NUM;no+)res = pthread _join(threadno, &thrd_ret);if(!res) |printf("Thread %d joinedn",no);elseprintf("Thread %d join failedn",no);
19、pthread_mutex_destroy(&mutex);return 0;3、完成教材上thread_attr .c例子,并运行查看结果,然后和前面两个例子比 较查看系统资源的差异。答:理论中线程在运行结束后就回收系统资源,并释放内存。程序代码:#include <stdio.h>#include <stdlib.h> |#include <pthread.h>#define REPEAT_NUMBER 3 /*线程中的小任务数 */#define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/int finish
20、_flag = 0;void *thrd_func(void *arg)int delay_time = 0;int count = 0;printf("Thread is starting'"');for (count = 0; count < REPEAT_NUMBER; count+)delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX) + 1; sleep(delay_time);printf("tThread : job %d delay = %dn", count, delay_time);printf("Thread finished'n");finish_flag = 1;pthread_exit(NULL);int main(void)pthread_t thread;pthread_attr_t attr;int no = 0, res;void * thrd_ret;srand(time(NULL);/*初始化线程属性对象*/res = pthread_attr_init (&attr);if (r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸英语函电全套课件
- 2023-2024学年安徽省宿州市省市示范高中高二下学期期中考试语文试题(解析版)
- 探索创新思维
- 塔城职业技术学院《预防医学(含医学统计学)》2023-2024学年第一学期期末试卷
- 武汉软件工程职业学院《外科止血包扎》2023-2024学年第一学期期末试卷
- 吉林省长春市八中2025届高三二模生物试题(文、理)试卷含解析
- 九寨沟县2025届四下数学期末质量检测试题含解析
- 江苏省淮安市淮阴师院附属中学2025届初三第一次模拟考试(1月)语文试题试卷含解析
- 宁夏大学《数字图形设计》2023-2024学年第一学期期末试卷
- 江西省安远县2025届中考物理试题模拟题及解析(江苏卷)含解析
- 湖北省武汉市2025届高中毕业生二月调研考试数学试题及答案
- 2023年江苏无锡市初中学业水平考试地理试卷真题(答案详解)
- 愚公移山英文 -中国故事英文版课件
- GB/T 4744-2013纺织品防水性能的检测和评价静水压法
- GB/T 24267-2009建筑用阻燃密封胶
- 2022年陕西省高中学业水平考试政治题(原题)
- 一带一路论文参考文献(70个范例参考),参考文献
- 销售谈判技巧课件
- 无锡鼋头渚课件
- 管道工技师理论知识题库及答案(完整版)
- JCP-200磁控溅射蒸发镀膜机 使用说明书
评论
0/150
提交评论