没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验报告10:线程1.pdf
资源推荐
资源详情
资源评论
操作系统实验报告10:线程1
操作系统实验报告10
实验内容
实验内容:线程(1)。
编译运⾏课件 Lecture13 例程代码:
Algorithms 13-1 ~ 13-8
实验环境
架构:Intel x86_64 (虚拟机)
操作系统:Ubuntu 20.04
汇编器:gas (GNU Assembler) in AT&T mode
编译器:gcc
技术⽇志
POSIX Pthreads
实验内容原理:
Pthreads是POSIX标准(IEEE 1003.1c)的扩展线程库,它定义了⼀个⽤于线程创建和同步的API,可以为⽤户级库或内核级库提供⽀
持,Pthreads是线程⾏为的规范,操作系统设计⼈员可以按照他们希望的任何⽅式执⾏实现这些规范。许多系统都实现了Pthreads规范,
⽐如UNIX类型的系统,包括Linux, Mac OS X和Solaris,Pthreads中常⽤的函数有:
函数函数 功能描述功能描述
pthread_create 创建⼀个新线程
pthread_exit 终⽌⼀个线程
pthread_join 等待特定的线程退出
pthread_yield 释放CPU从⽽让其它线程可以运⾏
pthread_attr_init 创建和初始化⼀个线程的属性结构
pthread_attr_destroy 清除⼀个线程的属性结构
其中实验中⽤到的函数有:
pthread_create() 函数⽤来创建⼀个线程,其中第⼀个参数为指向线程标识符的的⼀个指针,第⼆个参数为线程属性,第三个参数为线程运⾏
的函数的起始地址,第四个参数为向运⾏函数传递的参数。
pthread_join() 函数⽤来等待⼀个线程结束,其中第⼀个参数为等待退出的进程的进程号,第⼆个参数为退出的线程的返回值。
pthread_exit() 函数⽤来退出线程,其中参数代表线程的返回值。
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void*),void *arg);
1
int pthread_join(pthread_t thread, void **retval);
1
void pthread_exit(void *retval)
1
int pthread_attr_init(pthread_attr_t *attr)
1
pthread_attr_init() 函数⽤来初始化⼀个线程属性对象,其中参数代表线程属性结构体指针变量
验证实验alg.13-1-pthread-create.c
执⾏程序命令:
分析:
可以看到,向程序传递⼀个⼤于0的参数,程序创建⼀个线程进⾏计算后会返回从1到这个参数的所有整数的和,最后输出结果,如果输⼊
的是⼀个⼩于等于0或者⾮数字的参数,那么程序返回结果就是0。
实现细节解释:
⼀开始使⽤语句 pthread_create(&ptid, &attr, &runner, argv[1]) 创建⼀个线程,其中参数 &ptid 为指向线程标识符的的⼀个指针,参数 &attr 为要
设置的线程属性,参数 &runner 为线程运⾏的函数的起始地址,参数 argv[1] 为向运⾏函数传递的参数,在线程运⾏函数中:
参数 param 指向的是传递的参数 argv[1] , sum 是全局变量,函数的作⽤是对1到参数之间的所有正整数进⾏求和并把结果保存在全局变
量 sum ⾥,最后使⽤语句 pthread_exit(0) 返回值为0。
回到主函数中,在创建了线程之后,⼜使⽤函数 pthread_join(ptid, NULL) ,其中参数 ptid 即为刚才创建的线程的标识符, NULL 为默认属性,
函数的作⽤是使主线程等待这个计算求和值的线程运⾏完后再运⾏,不然还没得到计算结果主线程就继续向下执⾏,有可能出错。
最后打印求和值 sum 。
验证实验alg.13-1-pthread-create-1-1.c
执⾏程序命令:
gcc alg.13-1-pthread-create.c -pthread
./a.out 10
./a.out 100
./a.out -10
./a.out asd
1
2
3
4
5
static void *runner(void *param)
{
int i, upper;
upper = atoi(param);
sum = 0;
for (i =1; i <= upper; i++)
sum += i;
pthread_exit(0);
}
1
2
3
4
5
6
7
8
9
10
11
gcc alg.13-1-pthread-create-1-1.c -pthread
./a.out 10
./a.out 100
./a.out -10
./a.out asd
1
2
3
4
5
分析:
相⽐之前⼀个程序 alg.13-1-pthread-create ,这个程序还打印了计算线程的返回值16
实现细节解释:
与之前⼀个程序 alg.13-1-pthread-create 相⽐,这个程序的计算线程函数中:
在线程空间中申请了⼀块动态内存给⼀个整型指针,这个整型指针指向整数16,最后使⽤语句 pthread_exit((void *)retptr) 将这个指针作为线
程的返回值,利⽤指针实现了向主线程传递值。
在主函数中,语句 pthread_join(ptid, (void **)&retptr) 通过整型指针 retptr 接收到了计算线程的返回值,并把这个指针指向的值16打印出来,最
后释放指针的动态内存。
验证实验alg.13-1-pthread-create-1-2.c
执⾏程序命令:
分析:
static void *runner(void *param)
{
int i, upper;
upper = atoi(param);
sum = 0;
for ( i = 1; i <= upper; i++)
sum += i;
int *retptr = (int *)malloc(sizeof(int));
*retptr = 16;
pthread_exit((void *)retptr);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
gcc alg.13-1-pthread-create-1-2.c -pthread
./a.out 10
./a.out 100
./a.out -10
./a.out asd
1
2
3
4
5
剩余15页未读,继续阅读
资源评论
是空空呀
- 粉丝: 171
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功