版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 int pthread_t; 它是一个线程的标识符。函数pthread_create用来创建一个线程,它的原型为: extern int pthread_create(pthread_t *th
3、read, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。函数pthread_join用来等待一个线程的结束。函数原型为: extern int pthread_join(pthread_t th, void *thread_return); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。函数pthread_exit的
4、函数原型为: extern 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函数之前调用。 设置线程绑定状态的函数为 pthread_attr_setscope,
5、它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。 另外一个可能常用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数 pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。 4 线程的数据处理 和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、修改数据。但这也给多线程编程带来了许
6、多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。在函数中声明的静态变量常常带来问题,函数的返回值也会有问题。 互斥锁 互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的。 条件变量 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。 信
7、号量 信号量既可以作为二值计数器(即0,1),也可以作为资源计数器. 信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本。实验内容:线程函数编译时需要添加特殊编译选项:gcc *.c -lpthread -o1、 完成教材上thread.c的例子,想一下每次执行时结果相同吗,为什么?答:每个线程的运行和
8、结束时无序的、独立与并行的。实验代码:/* thread.c */#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define THREAD_NUMBER 3 /*线程数*/#define REPEAT_NUMBER 5 /*每个线程中的小任务数*/#define DELAY_TIME_LEVELS 6.0 /*小任务之间的最大时间间隔*/void *thrd_func(void *arg) /指针好乱,这里看不懂定义了什么,求解释/定义了一个返回值为指向空类型的指针的函数,该函数的参数为一
9、个指针 /* 线程函数例程 */ int thrd_num = (int)arg; /这个是赋值吗?看不懂,求解释 /定义了一个整型参数,取值为arg int delay_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; printf("tThread %d
10、: job %d delay = %dn",thrd_num, count, delay_time); sleep(delay_time); /暂停?秒 /暂停随机秒 /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 threadTHR
11、EAD_NUMBER; /定义了一个类型为pthread_t的数组,数组元素的个数为3 int no = 0, res; void * thrd_ret; /这句什么意思?求解释 /定义了一个指针,指向哪里后面的程序里有。 srand(time(NULL); /这句什么意思? 求解释 /用系统时间计算一个随机数。 for (no = 0; no < THREAD_NUMBER; no+) /* 创建多线程 */ res = pthread_create(&threadno, NULL, thrd_func, (void*)no); /&threadno线程标识符 /pth
12、read_create函数的参数含义请看书。 if (res != 0) /创建线程出错时 res=错误码 printf("Create thread %d failedn", no); exit(res);/上面的不是退出进程,而是判断pthread_create()函数是否成功执行。 printf("Create treads successn Waiting for threads to finish.n"); /如果上面没退出进程,则创建线程成功 for (no = 0; no < THREAD_NUMBER; no+) /* 等待线程结束
13、 */ res = pthread_join(threadno, &thrd_ret); / threadno线程标识符,此例总共有thread0,thread1,thread2,3个线程 /请看书上pthread_join()函数的参数含义。 if (!res) /res=0时,挂起线程成功 /res=0时,说明pthread_join()函数执行成功。 printf("Thread %d joinedn", no); else printf("Thread %d join failedn", no); return 0;2、 完成教材上thr
14、ead_mutex.c例,查看运行情况。和上例比较有何不同,想一下为什么会出现这种差异?答:这里3个线程之间的运行顺序跟创建线程的顺序相同。#include <stdio.h> #include <stdlib.h>#include <pthread.h>#define THREAD_NUM 3 /* 线程数 */#define REPEAT_NUM 3 /* 每个线程的小任务数 */#define DELAY_TIME_LEVELS 6.0 /*小任务之间的最大时间间隔*/ pthread_mutex_t mutex;void *thrd_func(voi
15、d *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 failedn", thrd_num); pthread_exit(NULL); printf("Thread %d is startingn", thrd_num); for(count = 0; count < REPEAT_NUM;coun
16、t+) 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(&mutex); pthread_exit(NULL); int main(void) pthread_t threa
17、dTHREAD_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("Create thread %d failedn", no); exit(res); printf
18、("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); else printf("Thread %d join failedn",no); pthread_mutex_destroy(&mutex); return 0;3、 完成教
19、材上thread_attr.c例子,并运行查看结果,然后和前面两个例子比较查看系统资源的差异。答:理论中线程在运行结束后就回收系统资源,并释放内存。程序代码:#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define REPEAT_NUMBER 3 /* 线程中的小任务数 */#define DELAY_TIME_LEVELS 10.0 /* 小任务之间的最大时间间隔 */int finish_flag = 0;void *thrd_func(void *arg) int delay_ti
20、me = 0; int count = 0; printf("Thread is startingn"); 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 finishedn"); 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 (res != 0) pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 瞳距测量安全操作规程
- PETA等级考试笔试试题及详细参考答案
- 2026中级注册安全工程师《生产管理》真题及答案解析完整版
- 道路基坑开挖支护施工工规程
- 高血压性脑出血围出血期气道管理共识
- 辽宁省抚顺市新宾县2027届数学七上期末经典模拟试题含解析
- (2026)全国禁毒知识竞赛题库(带参考答案)
- OCA数据库基础认证考试真题(含详细答案解析)
- 电池片破碎分选操作工规程
- 外墙吊篮安装及作业安全管控方案
- 广西主要树种地径测算蓄积量工作手册(正式版)D版
- 七年级考试小四门试卷及答案
- 房地产内勤年度述职报告
- 新公司成立规划方案(3篇)
- DB42∕T 2188-2024 《瓷器文物病害与图示》
- 网络舆情AI大模型数字化平台规划设计方案
- 《热学(第二版)》杨体强编-李椿 第3章 气体分子热运动速率和能量的统计分布学习资料
- 跌倒坠床的预防及护理
- DBJ51T 128-2019 四川省环保预制装配式板房制作、安装及验收技术标准
- 道路交通安全上下班安全培训教育课件
- 江西省法院书记员考试历年真题及答案详解
评论
0/150
提交评论