【操作系统实验5】线程分析

该实验通过创建两个线程,一个进行累加,一个进行累减,探讨了在使用pthread_join阻塞等待和不使用时线程执行的顺序与结果的不确定性。在加入pthread_join后,线程按照创建顺序执行,否则,由于线程调度的随机性,结果可能不同。
摘要由CSDN通过智能技术生成

一、实验目标

了解和掌握线程概念、Linux 系统线程创建

二、实验内容

1思路

创建两个线程,分别做累加和累减,然后运行1000次分别观察有pthread_join和没有的情况下线程的运行情况。

2.代码

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int sum;
void * runner01(void * param);
void * runner02(void * param);

int main (int argc, char * argv[])
{
        sum = 0;
        pthread_t tid01;
        pthread_t tid02;
        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(&tid01, &attr, runner01, argv[1]);
        pthread_create(&tid02, &attr, runner02, argv[1]);
        pthread_join(tid01, NULL);
        pthread_join(tid02, NULL);

        pthread_exit(0);
}

 

void * runner01(void * param)
{
        int upper = atoi(param);
        for (int i = 1; i <= upper; i++)
                 sum += i;
        printf("[Thread 1] sum = %d\n", sum);
}

 

void * runner02(void * param)
{
        int lower = atoi(param);
        for (int i = 1; i <= lower; i++)
                 sum -= i;
        printf("[Thread 2] sum = %d\n", sum);

}

3.过程及运行结果展示

编译运行 thread.c 程序

在这里插入图片描述

利用 thread.sh 脚本程序运行 thread 程序1000次,并查看每次运行结果是否一致
在这里插入图片描述

把 thread.c 程序改成先运行 runner01 线程之后,在运行 runner02 线程

在这里插入图片描述

三、实验结论

创建两个线程,分别做累加和累减,然后运行1000次分别观察有pthread_join和没有的情况下线程的运行情况:创建两个线程runner01和runner02,如果有join函数也就是阻塞至某一个线程执行完才能执行另一个线程,此时runner01线程始终先运行,但是如果没有join则两个线程会交替运行,产生不同的结果,因为此时操作系统调用线程的顺序是不可确定的。

附录:代码

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int sum;
void * runner01(void * param);
void * runner02(void * param);

int main (int argc, char * argv[])
{
        sum = 0;
        pthread_t tid01;
        pthread_t tid02;
        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(&tid01, &attr, runner01, argv[1]);
        pthread_create(&tid02, &attr, runner02, argv[1]);
        pthread_join(tid01, NULL);
        pthread_join(tid02, NULL);

        pthread_exit(0);
}

 

void * runner01(void * param)
{
        int upper = atoi(param);
        for (int i = 1; i <= upper; i++)
                 sum += i;
        printf("[Thread 1] sum = %d\n", sum);
}

 

void * runner02(void * param)
{
        int lower = atoi(param);
        for (int i = 1; i <= lower; i++)
                 sum -= i;
        printf("[Thread 2] sum = %d\n", sum);

}
#! /bin/bash
for ((i = 1; $i <= 1000; i++));
do
    echo $i
    ./thread
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值