DDD操作系统实验(四)

实验目的

  1. 掌握线程的创建、启动、运行等方法;
  2. 理解多线程,能够编写多线程类应用。

实验内容

2.1 线程基本操作

(1)阅读课本线程这一章Fig. 4.6关于线程创建的实例,然后完成课本上的习题4.9(见下面英文,我们要用ubuntu Pthread完成)。如果你确实无法完成4.9,请重复课本Fig. 4.6的实例(见下图,想省事直接拷贝对不对?可惜我贴心地贴了图嘿嘿嘿)。可以在代码中加入全局和局部变量,并观察结果,给出结果的同时要说明为什么会得到这样的结果。

#include <pthread.h>
#include <stdio.h>
int sum;
void *runner(void *param);
int main(int argc,char *argv[]){
    pthread_t tid;
    pthread_attr_t attr;

    if(argc!=2){
       fprintf(stderr,"usage:a.out<integer value>\n");
       return -1;
    }
    if(atoi(argv[1])<0){
        fprintf(stderr,"%d must be >= 0\n",atoi(argv[1]));
	return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid,&attr,runner,argv[1]);

    pthread_join(tid,NULL);
    printf("sum = %d\n",sum);
}

void *runner(void *param){
    int i,upper = atoi(param);
    sum = 0;

    for(i=1;i<=upper;i++) sum+=i;

    pthread_exit(0);
}

2.2 跳高比赛

森林里要举行跳高比赛,各动物纷纷报名参赛。最后进入决赛的有3位选手,分别是:跳蚤、袋鼠和羚羊。请写一个程序,将三只动物视为3个线程,按照下列规则模仿三只动物的比赛过程,画出你所设计的比赛流程图(见本次实验PPT我的示例,这是我的想法,同学们可以自由发挥),并展示比赛结果。思考并回答问题:多个动物线程之间会并发吗?为什么?
具体规则:

  1. 最后的输赢规则是:定义r=跳高的高度/身高;r最大的动物获得冠军。
  2. 比赛的顺序是:首先,百兽之王老虎宣布比赛开始(可打印:老虎宣布,比赛开始!);随后,动物们进入场地就位(可在程序中打印:XXX动物就位);然后,开始测量身高(可打印:XXX动物身高测量完毕,身高=ZZZ cm);接着,开始跳高(可打印:XXX动物跳高高度为YYY cm);最后,老虎汇总结果,通过比较选出冠军、亚军、季军。
  3. 上述动物的身高、跳的高度,同学们可以通过聪明才智自由发挥获得,例如可以通过随机数生成跳高高度、将身高设为固定值。
  4. 可以设定每个动物都跳N次,取平均值作为最后总成绩。
  5. 最终展现的结果需要截图,界面漂亮美丽将有加分。
#include <pthread.h>
#include <stdio.h>
#include <math.h>
double r1,r2,r3;
//srand((unsigned int) time(0));
void *jump_flea(){
    int height = rand()%5+1;
    double jump = rand()%50+100;
    printf("flea ready!\nflea's height:%d cm\nflea jump height:%f cm\n",height,jump);
    r1 = jump/height; 
    pthread_exit(0);
}

void *jump_kangaroo(){
    int height = rand()%50+100;
    double jump = rand()%100+200;
    printf("kangaroo ready!\nkangaroo's height:%d cm\nkangaroo jump height:%f cm\n",height,jump);
    r2 = jump/height;
    pthread_exit(0);
}
void *jump_antelope(){
    int height = rand()%100+100;
    double jump = rand()%100 + 300;
    printf("antelope ready!\nantelope's height:%d cm\nantelope jump height:%f cm\n",height,jump);
    r3=jump/height;
    pthread_exit(0);
}

int main(int argc,char *argv[]){
    pthread_t flea, kangaroo, antelope;
    pthread_attr_t attr_flea, attr_kangaroo, attr_antelope;

    if(argc!=2){
       fprintf(stderr,"usage:lab2<integer value>\n");
       return -1;
    }
    if(atoi(argv[1])<0){
        fprintf(stderr,"%d must be >= 0\n",atoi(argv[1]));
        return -1;
    } 
    printf("COMPITITON BEGIN!!!\n");

    pthread_attr_init(&attr_flea);
    pthread_attr_init(&attr_kangaroo);
    pthread_attr_init(&attr_antelope);

    pthread_create(&flea,&attr_flea,jump_flea,argv[1]);
    pthread_create(&kangaroo,&attr_kangaroo,jump_kangaroo,argv[1]);
    pthread_create(&antelope,&attr_antelope,jump_antelope,argv[1]);

    pthread_join(flea,NULL);
    pthread_join(kangaroo,NULL);
    pthread_join(antelope,NULL);
    
    //pthread_attr_init(&attr_kangaroo);
    //pthread_create(&kangaroo,&attr_kangaroo,jump_kangaroo,argv[1]);
    //pthread_join(antelope,NULL);

    //pthread_attr_init(&attr_antelope);
    //pthread_create(&antelope,&attr_antelope,jump_antelope,argv[1]);
    //pthread_join(antelope,NULL);


    if(r1>r2 && r1>r3){
    	if(r2>r3)   printf("NO.1 flea\nNO.2 kangaroo\nNO.3 antelope\n");
	else if(r3>r2) printf("NO 1 flea\nNO.2 antelope\nNO.3 kangaroo\n");
    }
    else if(r2>r1 && r2>r3){
	if(r1>r3) printf("NO.1 kangaroo\nNO.2 flea\nNO.3 antelope\n");
	else if(r3>r1) printf("NO.1 kangaroo\nNO.2 antelope\nNO.3 flea\n");
    }
    else{
    	if(r1>r2) printf("NO.1 antelope\nNO.2 flea\nNO.3 kangaroo\n");
	else if(r1<r2) printf("NO.1 antelop\nNO.2 kangaroo\nNO.3 flea\n");
    }
}                     

实验准备

POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。

  • pthread_create():创建一个线程 pthread_exit():终止当前线程
  • pthread_cancel():中断另外一个线程的运行 pthread_join():阻塞当前的线程,直到另外一个线程运行结束
  • pthread_attr_init():初始化线程的属性
  • pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
  • pthread_attr_getdetachstate():获取脱离状态的属性
  • pthread_attr_destroy():删除线程的属性 pthread_kill():向线程发送一个信号

使用上述函数时,注意两个问题:

  1. 要包含上述函数的头文件;(这类错误是implicit declaration of function XXX)
  2. 要在命令行中加-lpthread进行链接(这类错误是undefined reference to XXX)。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值